标签: auto-increment

从多个会话写入时,last_insert_id() 是否返回正确的结果?

我有一个表,其中有 4 列的组合将充当唯一键。

我想保留一个 id 列作为主键,而不是使用复合主键。该字段在 auto_increment 上。对数据库的插入是通过 C 接口完成的。当插入一行时,我想知道它被分配的 id。LAST_INSERT_ID() 可用于检索它,但会有多个会话插入到表中。在这种情况下 LAST_INSERT_ID() 会返回正确的值吗?

我已经阅读了这篇文章:MySql 的 LAST_INSERT_ID() 函数保证正确吗? 它表示插入多行时返回第一个插入行的 id。

当多个会话写入同一个表但单个会话一次只写入一行时,是否可以检索生成的 id 的正确值?隔离级别也重要吗?

mysql primary-key auto-increment

6
推荐指数
1
解决办法
3777
查看次数

如何在 MySQL phpmyadmin 中使用 2 个自增列

是否可以使用 2 个自动增量值?

  • 一个从0开始
  • 另4000400起

请帮我

mysql phpmyadmin auto-increment

6
推荐指数
2
解决办法
5万
查看次数

什么会导致自动递增主键跳过数字?

我有一个使用以下 T-SQL 创建的表:

CREATE TABLE [dbo].[TableName](
    [id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我今天查看了这张表,注意到 id 列正在跳过值:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26、27、1027、1028、1029、1030、1031、1032、1033、1034、1035、2034、2035、3034

我不担心这个或任何事情(我的应用程序不关心主键是什么),我只是想知道可能导致这种情况发生的原因。似乎确实有一种模式,每次“跳跃”发生时跳跃 1000。

我的应用程序使用实体框架插入这些行,如果这有什么不同的话。

sql-server entity-framework auto-increment identity sql-server-2012

6
推荐指数
1
解决办法
4万
查看次数

如何让 MySQL 以随机顺序自动递增?

我有一个表,其中包含进入其他表的几个键(其中每个键由多列组成)。我想为每个键创建一个新列,该列将是一个整数,以便该值i表示该ith键的出现(但我希望该排序是随机的)。我想也许某种自动增量会起作用,但我有多个键,因此需要多列(我相信只允许一个自动增量)。

我想出的解决方案似乎不起作用。首先,我创建了一个新表来存储我感兴趣的列,以及一个额外的列rnd. 我rnd稍后会ORDER BY rand()在需要实际列而不是函数的上下文中使用。这是我如何完成第一点:

SET @rnd = 0;
INSERT INTO new_table SELECT col1, ..., colN, @rnd := @rnd+1 FROM original_table ORDER BY rand();
Run Code Online (Sandbox Code Playgroud)

接下来,我将根据键添加一个自动增量,并使用rnd我刚刚创建的列。在ALTER TABLE...ORDER BY不通过函数(如允许排序rand()),所以这就是为什么我需要创建的rnd第一列:

ALTER TABLE new_table ADD first_index INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD KEY(col1, col2, first_index), ORDER BY rnd;
Run Code Online (Sandbox Code Playgroud)

然后我会删除自动增量状态并为每个键重复:

ALTER TABLE new_table MODIFY COLUMN first_index INT UNSIGNED NOT NULL;
Run Code Online (Sandbox Code Playgroud)

起初,这似乎奏效了。然而,仔细检查后,似乎没有遵守随机排序。索引列的创建顺序与原始表碰巧使用的顺序相同。当我经历了几个非常尴尬的步骤以确保随机排序时,我感到相当沮丧,而这甚至不起作用。为什么我的解决方案不起作用,有没有更优雅的方法来做到这一点?

编辑:显然我不清楚我在找什么,所以我会尝试一个简单的例子:

Col1   Col2   <other columns>
1997 …
Run Code Online (Sandbox Code Playgroud)

mysql order-by auto-increment random

5
推荐指数
1
解决办法
5531
查看次数

主键的意义是什么?

为什么我的数据库需要有一个主键才能正常运行?在我阅读的每个教程中,您都需要将 id 键设为主键。主键的作用与常规单元格有何不同?

database-design primary-key auto-increment

5
推荐指数
1
解决办法
5835
查看次数

如果 MAX(id) != COUNT(id),这是否意味着行已被删除?

这个问题几乎说明了一切。我们在这里谈论 MySQL,版本 5.1。

我想知道的是这是否严格意味着行已被删除,或者是否有其他可能的情况可能导致这种情况:奇怪的锁定或竞争条件等,迫使表的ID计数器为一次插入多次递增。

mysql auto-increment mysql-5.1

5
推荐指数
1
解决办法
422
查看次数

以某些字符为前缀的自动增量字符变化列

我在 PostgreSQL 中有一个用于医院患者的表,我想将它的主键设置为PAT0000001( char varying) 并将该字段保持为自动增量

有没有办法实现这一目标?

postgresql database-design auto-increment postgresql-9.2

5
推荐指数
1
解决办法
1万
查看次数

当 PostgreSQL 中的 INSERT 语句失败时防止主键增量

我的 PostgreSQL 数据库中有一个简单的表,如下所示:

CREATE TABLE person_type
(
  id serial NOT NULL,
  name character(55) NOT NULL,
  CONSTRAINT person_type_pkey PRIMARY KEY (id),
  CONSTRAINT person_type_name_key UNIQUE (name)
)
Run Code Online (Sandbox Code Playgroud)

如您所见,id会自动递增,并且名称必须是唯一的。每次我运行 INSERT sql 语句时,即使它失败,id 也会增加 1。

我怎样才能防止这种情况?为了每次成功插入一行,主键是相关的

postgresql primary-key auto-increment

5
推荐指数
1
解决办法
5363
查看次数

发生插入错误后MySQL自增列增加

我在我的数据库中做了一些插入测试,我意识到当 INSERT 语句失败时,由于错误 1452,导致 auto_increment 值增加 1。即使在这个语句中没有插入任何行。

因此,此行为导致下一个有效插入跳过 auto_increment 的可用和可能值。

例子:

1st Insert | Result: Success | id(auto_increment_column): 1       |
2nd Insert | Result: Failure | -------- No rows were recorded---- |
3nd Insert | Result: Success | id(auto_increment_column): 3       |
Run Code Online (Sandbox Code Playgroud)

我想知道之前是否有人遇到过这个问题,这是否真的是一个问题。

干杯。

PS:

错误:1452 - fk 约束失败。这意味着我试图引用另一个表中的某个列值,但该值在那里不存在。

  • 数据库:MySQL Ver 14.14 Distrib 5.6.13,适用于 Windows 64 位
  • 存储引擎:InnoDB

mysql innodb insert auto-increment

5
推荐指数
1
解决办法
6544
查看次数

InnoDB 复合键上的 AUTO_INCREMENT 技巧

与 MySQL MyISAM-Engine 相比,InnoDB-Engine 无法处理复合主键的一列声明为AUTO_INCREMENT. 例如,考虑下表:

CREATE TABLE `ExampleTable` (
     `KeyPartA` mediumint(8) unsigned NOT NULL,
     `KeyPartB` smallint(5) unsigned NOT NULL,
     `Data` text NOT NULL,
     PRIMARY KEY (`KeyPartA`,`KeyPartB`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

现在模拟AUTO_INCREMENT,我了解到,可以创建以下触发器

DELIMITER $$

CREATE TRIGGER ExampleAutoIncrement BEFORE INSERT ON ExampleTable
FOR EACH ROW BEGIN
        SET NEW.KeyPartB = (
             SELECT IFNULL(MAX(KeyPartB), 0) + 1
             FROM ExampleTable
             WHERE KeyPartA  = NEW.KeyPartA
        );
END $$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

现在插入工作正常,生成自动递增的值。不幸的是,我想不出一种明智的方法来获取新创建的键值。

由于LAST_INSERT_ID()没有实际的AUTO_INCREMENT列,因此它的 C 对应项都不会返回它。也不能LAST_INSERT_ID(IFNULL(MAX(KeyPartB), 0) + 1)在 …

mysql innodb trigger auto-increment

5
推荐指数
1
解决办法
7707
查看次数