为什么有时自动增量列的值中存在一个或多个间隙?

时间:2016-06-16 17:47:58

标签: mysql sql

我有一张这样的表:

IF (UPDATE(colX))

当我在该表中插入一些新值时,// colors +----+-------+ | id | color | +----+-------+ | 1 | red | | 2 | blue | +----+-------+ -- id column is auto increment (PK) 列中有时会出现一些空白。像这样:

id

SQL FiddleRexTester

上的重复内容

那有什么不对?为什么有时INSERT INTO colors (color) SELECT 'gray' UNION ALL SELECT 'black' UNION ALL SELECT 'green' UNION ALL SELECT 'pink'; /* output: +----+-------+ | id | color | +----+-------+ | 1 | red | | 2 | blue | | 6 | gray | -- expected id is 3, but it is 6 | 7 | black | | 8 | green | | 9 | pink | +----+-------+ */ 的值超出正常顺序?我该如何预防?

编辑:我已经创建了这样的表:

id

当我在两个不同的步骤中粘贴此查询两次时:

CREATE TABLE colors (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
color VARCHAR(30) NOT NULL
)

结果如下:

enter image description here

如您所见,INSERT INTO colors (color) SELECT 'gray' UNION ALL SELECT 'black' UNION ALL SELECT 'green' UNION ALL SELECT 'pink'; 列的顺序不连续。为什么呢?

注1:引擎 InnoDB 注2:以下是下一行的自动增量数: enter image description here

1 个答案:

答案 0 :(得分:-1)

它似乎与INSERT语句的形成方式有关。请参阅this fiddle,该示例稍加修改。在这种情况下,您不会出现间隙(但如果添加更多插入,则可能会出现间隙... in fact, it does。)。

编辑:经过一点点挖掘后,我发现如果你使用MyISAM引擎(而不是InnoDB)你就不会出现间隙。那么,也许它是InnoDB中的一个缺陷或奇怪的设计选择......?

编辑2:进一步挖掘显示this bug,针对InnoDB存储引擎提交。它非常接近地匹配原始问题的用例。没有提供该错误的解决方案,但似乎一个解决方案是在mysqld启动之前在my.cnf文件中将innodb_autoinc_lock_mode设置为0。