MySQL';s在多行插入中的自动增量行为

MySQL';s在多行插入中的自动增量行为,mysql,auto-increment,multiple-insert,Mysql,Auto Increment,Multiple Insert,我认为我的问题的答案是显而易见的,但由于我找不到任何支持它的文档,我认为这是值得问的。至少记录在案 众所周知,AUTO_INCREMENT字段在每次执行INSERT语句时都会递增。它的值可以通过LAST\u INSERT\u ID()函数检索。还提到,对于多行插入,LAST\u INSERT\u ID()将返回插入行的第一个ID。我认为这是个好主意(非常有用) 我的问题是: 我是否可以假设在具有多行的INSERT IGNORE INTO语句中,AUTO_INCREMENT字段的插入ID始终是连续

我认为我的问题的答案是显而易见的,但由于我找不到任何支持它的文档,我认为这是值得问的。至少记录在案

众所周知,
AUTO_INCREMENT
字段在每次执行
INSERT
语句时都会递增。它的值可以通过
LAST\u INSERT\u ID()
函数检索。还提到,对于多行插入,
LAST\u INSERT\u ID()
将返回插入行的第一个ID。我认为这是个好主意(非常有用)

我的问题是:

我是否可以假设在具有多行的
INSERT IGNORE INTO
语句中,
AUTO_INCREMENT
字段的插入ID始终是连续的?请记住,由于MySQL服务器的
IGNORE
修饰符和多用户特性,可能会出现不同的情况


谢谢。

不,你不能这样想。在复制多主机设置中,ID不是连续的一种情况。例如,如果在这样的设置中存在两个服务器,一个将只生成偶数个自动ID,另一个只生成奇数个ID(请记住,这只是一个示例)

但是,如果您的设置不是这样的,那么是的。至少在InnoDB中,插入是原子的,并且在指向同一个表时排队,所以来自两个不同插入的ID不会交错。(虽然没有文档记录,所以依赖它……有点风险)


如何测试忽略插入ID生成:

mysql> CREATE TABLE  `ignoreinsert` (
    ->   `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `uq` int(10) unsigned NOT NULL,
    ->   PRIMARY KEY (`ID`),
    ->   UNIQUE KEY `uq` (`uq`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.19 sec)

mysql> INSERT INTO ignoreinsert VALUES (null,1),(null,2);
Query OK, 2 rows affected (0.10 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
+----+----+
2 rows in set (0.00 sec)

mysql> INSERT IGNORE INTO ignoreinsert VALUES (null,3),(null,1),(null,4),(null,2),(null,5);
Query OK, 3 rows affected (0.08 sec)
Records: 5  Duplicates: 2  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
|  4 |  4 |
|  5 |  5 |
+----+----+
5 rows in set (0.00 sec)

如果
忽略
修改器,即使插入了重复行,重复行是否也会使计数器前进?我这样问是因为我看到在没有
IGNORE
修饰符的单行
INSERT
语句中,即使没有插入行,当发生错误时,计数器也会增加!Mehran Ziadloo:我只是做了一个确认检查,ID是顺序的。我的错误是,使用
忽略
修饰符不会增加计数器。也就是说,重复的键错误会变成警告的行。