我已经看到很多解释为什么mysql跳过一些自动增量值(并且它不是一个bug,因为mysql从不声明它们应该是连续的)。我不确定为什么它们中的任何一个适用于这个简单的测试用例。我不知道所有最新版本的mysql的结果是否相同。还添加:
ALTER TABLE test_table2 AUTO_INCREMENT = 1;
两个INSERT INTO test_table2行之间的按顺序生成顺序。
有谁知道为什么这个简单的案例会跳过ids 6和7?
CREATE TABLE test_table1 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table1(`test`) VALUES('value 1');
INSERT INTO test_table1(`test`) VALUES('value 2');
INSERT INTO test_table1(`test`) VALUES('value 3');
INSERT INTO test_table1(`test`) VALUES('value 4');
INSERT INTO test_table1(`test`) VALUES('value 5');
CREATE TABLE test_table2 (
`id` INT NOT NULL AUTO_INCREMENT,
`test` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO test_table2(`test`) SELECT `test` FROM test_table1;
INSERT INTO test_table2(`test`) SELECT `test` FROM test_table1;
SELECT * FROM test_table2;
我的mysql版本的结果:
'1', 'value 1'
'2', 'value 2'
'3', 'value 3'
'4', 'value 4'
'5', 'value 5'
'8', 'value 1'
'9', 'value 2'
'10', 'value 3'
'11', 'value 4'
'12', 'value 5'
提前致谢。
答案 0 :(得分:6)
这是InnoDB中自动增量锁定的一个示例:当您在同一会话中同时执行2个语句时:第一个查询获取自动增量锁定,并且自动增量值生成不在语句之间交错 - 即整个交易点。
这总是会在设计上发生:如果没有,那么InnoDB中的事务的工作方式就行不通了。 OLTP类型加载下的可伸缩性将是非常糟糕的,因为每个插入都必须等待每个其他插入完成,提交或更糟 - 回滚。
I.e。:如果您的第一个插入比第二个插入的运行时间延长了5倍,并且失败并被回滚,则第二个插入仍然完成并且已经提交。否则,你将不得不等待ea。查询在另一个之后完成。
如果您需要顺序且绝对唯一的ID#,请从其他来源中提取它们。 AutoInc列只保证一个独特的值 - 不一定是单序列 - 这是一个序列化点和瓶颈点。
如果需要,可以采取一种方法:
在my.cnf / mysql.ini中设置innodb_autoinc_lock_mode = 0
答案 1 :(得分:1)
一个原因是您触发了
UNIQUE INDEX
。
当您尝试插入已经在唯一索引中的字段时,将跳过ID。