插入选择时,Mysql自动增量跳转

时间:2012-09-01 08:13:06

标签: mysql auto-increment

我正在测试insert-select查询,并注意到一个奇怪的结果。

CREATE TABLE `test` (
  `cnt` int(11) NOT NULL AUTO_INCREMENT,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`cnt`)
)

CREATE TABLE `test_current` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL
)

首先,我创建了两个表,并将一些值插入test_current

mysql> insert into test_current (a,b) values (1,1),(2,2);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

我做了这个查询

mysql> INSERT INTO test (a,b) SELECT a,b FROM test_current;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from test;
+-----+------+------+
| cnt | a    | b    |
+-----+------+------+
|   1 |    1 |    1 |
|   2 |    2 |    2 |
+-----+------+------+
2 rows in set (0.00 sec)

但是当我再次进行查询时

mysql> INSERT INTO test (a,b) SELECT a,b FROM test_current;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from test;
+-----+------+------+
| cnt | a    | b    |
+-----+------+------+
|   1 |    1 |    1 |
|   2 |    2 |    2 |
|   4 |    1 |    1 |
|   5 |    2 |    2 |
+-----+------+------+

自动增量刚刚跳过cnt为3.我想知道这是什么。

3 个答案:

答案 0 :(得分:1)

您可以从 my.ini 更改innodb_autoinc_lock_mode = 0(“传统”锁定模式),以避免在某些情况下跳过主键中的值。有关更多详细信息,请参见手册mysql manual for innodb auto increment handling

  

根据手册“由于语义上可能存在差异,提供了传统的锁定模式选项以实现向后兼容性,性能测试以及解决“混合模式插入”问题。”

     

'在这种锁定模式下,所有“类似于INSERT”的语句均获得特殊的表级AUTO-INC锁定,以便将其插入具有AUTO_INCREMENT列的表中。此锁定通常保持在语句的末尾(而不是事务的末尾),以确保为给定的INSERT语句序列以可预测和可重复的顺序分配自动增量值,并确保自动增量任何给定语句分配的值都是连续的。

要检查的另一件事是auto_increment_increment配置变量的值。默认情况下为1,但是您可能已经更改了它。将它设置为大于1或2的情况很少见,但是可以的。

或者如果您的情况不起作用,您也可以在同一页面中使用类似AnandPhadke的答案之类的查询:

  

ALTER TABLE表名AUTO_INCREMENT = 1;
  INSERT INTO表名(col1,col2,col3)从表名中选择col1,col2,col3;

答案 1 :(得分:0)

加入你的My.cnf:

innodb_autoinc_lock_mode=0

答案 2 :(得分:-1)

每次将值插入表格之前,您都可以将auto_increment值重置为1:

ALTER TABLE `test` AUTO_INCREMENT = 1;
INSERT INTO test (a,b) SELECT a,b FROM test_current;