为什么mysql会跳过一些自动增量ID?

时间:2013-07-16 05:01:21

标签: mysql

我已经看到很多解释为什么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'

提前致谢。

2 个答案:

答案 0 :(得分:6)

这是InnoDB中自动增量锁定的一个示例:当您在同一会话中同时执行2个语句时:第一个查询获取自动增量锁定,并且自动增量值生成不在语句之间交错 - 即整个交易点。

这总是会在设计上发生:如果没有,那么InnoDB中的事务的工作方式就行不通了。 OLTP类型加载下的可伸缩性将是非常糟糕的,因为每个插入都必须等待每个其他插入完成,提交或更糟 - 回滚。

I.e。:如果您的第一个插入比第二个插入的运行时间延长了5倍,并且失败并被回滚,则第二个插入仍然完成并且已经提交。否则,你将不得不等待ea。查询在另一个之后完成。

如果您需要顺序且绝对唯一的ID#,请从其他来源中提取它们。 AutoInc列只保证一个独特的值 - 不一定是单序列 - 这是一个序列化点和瓶颈点。

如果需要,可以采取一种方法:

在my.cnf / mysql.ini中设置innodb_autoinc_lock_mode = 0

Description of auto inc locking in InnoDB and Options

答案 1 :(得分:1)

一个原因是您触发了 UNIQUE INDEX

当您尝试插入已经在唯一索引中的字段时,将跳过ID。