7

我已经看到很多解释为什么 mysql 会跳过一些自动增量值(并且这不是一个错误,因为 mysql 从未声明它们应该是连续的)。我不确定为什么它们中的任何一个都适用于这个简单的测试用例。我不知道所有最新版本的mysql的结果是否相同。还添加:

ALTER TABLE test_table2 AUTO_INCREMENT = 1;

在 2 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'

提前致谢。

4

2 回答 2

10

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

这将始终按设计发生:如果没有,InnoDB 中的事务工作方式,嗯,就不会工作。OLTP 类型负载下的可伸缩性将是可怕的,因为每个插入都必须等待每个其他插入完成、提交或更糟——回滚。

即:如果您的第一个插入运行时间比第二个长 5 倍,并且失败并回滚,则第二个插入仍然完成并已提交。否则,您将不得不等待 ea。查询完成后其他。

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

如果需要,一种解决方法:

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

InnoDB 和选项中的 auto inc 锁定说明

于 2013-07-16T05:23:02.557 回答
2

一个原因是你有一个UNIQUE INDEX被触发的。

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

于 2020-05-19T16:47:25.443 回答