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是顺序的。我的错误是,使用忽略修饰符不会增加计数器。也就是说,重复的键错误会变成警告的行。