10

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

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

所以这是我的问题:

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

谢谢。

4

1 回答 1

10

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

但是,如果您的设置不是这样,那么可以。至少在 InnoDB 中,插入是原子的,并且在针对同一个表时会排队,因此来自两个不同 INSERT 的 ID 不会交错。(虽然它没有记录,所以依赖它......有点冒险)


我如何测试 IGNORE INSERT 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)
于 2011-08-01T08:35:04.627 回答