我有一张这样的表:
IF (UPDATE(colX))
当我在该表中插入一些新值时,// colors
+----+-------+
| id | color |
+----+-------+
| 1 | red |
| 2 | blue |
+----+-------+
-- id column is auto increment (PK)
列中有时会出现一些空白。像这样:
id
那有什么不对?为什么有时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
)
结果如下:
如您所见,INSERT INTO colors (color)
SELECT 'gray'
UNION ALL
SELECT 'black'
UNION ALL
SELECT 'green'
UNION ALL
SELECT 'pink';
列的顺序不连续。为什么呢?
答案 0 :(得分:-1)
它似乎与INSERT语句的形成方式有关。请参阅this fiddle,该示例稍加修改。在这种情况下,您不会出现间隙(但如果添加更多插入,则可能会出现间隙... in fact, it does。)。
编辑:经过一点点挖掘后,我发现如果你使用MyISAM引擎(而不是InnoDB)你就不会出现间隙。那么,也许它是InnoDB中的一个缺陷或奇怪的设计选择......?编辑2:进一步挖掘显示this bug,针对InnoDB存储引擎提交。它非常接近地匹配原始问题的用例。没有提供该错误的解决方案,但似乎一个解决方案是在mysqld启动之前在my.cnf文件中将innodb_autoinc_lock_mode
设置为0。