Meh*_*ran 8 mysql auto-increment multiple-insert
我认为我的问题的答案是显而易见的,但由于我找不到任何支持它的文件,我认为值得问.至少是为了记录.
众所周知,AUTO_INCREMENT每次INSERT执行语句时字段都会递增.它的值可以通过LAST_INSERT_ID()函数检索.MySQL手册中还提到,使用多行插入时,LAST_INSERT_ID()将返回插入行的第一个ID.我认为这是一个好主意(非常有用).
所以这是我的问题:
我可以在INSERT IGNORE INTO具有多行的语句中假设,AUTO_INCREMENT字段的插入ID 将始终是顺序的吗?请记住,由于IGNORE修改器和MySQL服务器的多用户性质,可能会发生不同的情况.
谢谢.
不,你不能假设.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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7260 次 |
| 最近记录: |