执行MySQL批量插入查询后,自动增量id字段不是add 1
在测试我制作的用户表时,我发现了一些奇怪的东西。 如下图所示,在执行批量插入多个用户的查询后添加单行时,id字段的值将增加2,而不是1 批量插入查询执行MySQL批量插入查询后,自动增量id字段不是add 1,mysql,Mysql,在测试我制作的用户表时,我发现了一些奇怪的东西。 如下图所示,在执行批量插入多个用户的查询后添加单行时,id字段的值将增加2,而不是1 批量插入查询 INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (1,'test1',1,0) ,(NULL,'test2',1,0) ,(NULL,'test3',1,0) ,(NULL,'test4',1,0); INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP
INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (1,'test1',1,0)
,(NULL,'test2',1,0)
,(NULL,'test3',1,0)
,(NULL,'test4',1,0);
INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (NULL,'test5',1,0);
单行插入查询
INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (1,'test1',1,0)
,(NULL,'test2',1,0)
,(NULL,'test3',1,0)
,(NULL,'test4',1,0);
INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (NULL,'test5',1,0);
预期结果
实际结果
如果在批量插入查询中不强制使用id字段,则可以正常工作。
但我想知道为什么会这样
提前谢谢。这其实很棘手 所以mysql计数+1,所以它似乎跳过了1个数字 如果我把它作为第一个插入
(2,'test1',1,0)
它从2开始,在第一次插入结束时也“跳过”2,因为在他的内部计数器中有14(12+2)
ID |昵称|用户| LV |经验
-: | :------- | ------: | --:
2 |测试1 | 1 | 0
3 |测试2 | 1 | 0
4 |测试3 | 1 | 0
5 |测试4 | 1 | 0
6 |测试5 | 1 | 0
7 |测试6 | 1 | 0
8 |测试7 | 1 | 0
9 |测试8 | 1 | 0
10 |测试9 | 1 | 0
11 |测试10 | 1 | 0
12 |测试11 | 1 | 0
13 |测试12 | 1 | 0
15 |测试13 | 1 | 0
16 |测试14 | 1 | 0
小提琴
因此,从
(NULL,'test1',1,0)
开始,所有不可复制的东西都能按预期工作。看,只要你不删除行,它应该总是给你下一个数字,hwat可能会发生,“订单”可能会变得混乱,但你能再详细一点吗?我无法复制你的问题,请看fiddle,因此,根据我的经验,如果没有像删除一行这样的用户操作,就不会发生跳过。当然,当你有一台负载很重的服务器,流量很大,而且不同的实体的mysql或处理器可以重新排列代码时,我会想到一个数字跳过的PSOBILT,但批量插入不是一个原因。也就是说,正如我提到的,有一些实体可以重新排列代码,测试1可能在测试3之后,甚至有一个序列号。请参阅相关内容:自动增量值是否由内部计数器值确定?内部计数器和最后一个插入ID之间的关系是什么?
| LAST_INSERT_ID() |
| ---------------: |
| 1 |
INSERT INTO USER_TB VALUES (NULL,'test13',1,0),(NULL,'test14',1,0)
SELECT LAST_INSERT_ID();
| LAST_INSERT_ID() |
| ---------------: |
| 13 |
SELECT * FROM USER_TB;
ID | NICKNAME | USER_LV | EXP
-: | :------- | ------: | --:
1 | test1 | 1 | 0
2 | test2 | 1 | 0
3 | test3 | 1 | 0
4 | test4 | 1 | 0
5 | test5 | 1 | 0
6 | test6 | 1 | 0
7 | test7 | 1 | 0
8 | test8 | 1 | 0
9 | test9 | 1 | 0
10 | test10 | 1 | 0
11 | test11 | 1 | 0
12 | test12 | 1 | 0
13 | test13 | 1 | 0
14 | test14 | 1 | 0
(1,'test1',1,0)
(2,'test1',1,0)
CREATE TABLE USER_TB (ID INT Auto_inCREMENT Primary KEY,
NICKNAME varchar(50)
,USER_LV INT ,
EXP BIGINT)
INSERT INTO USER_TB (ID,NICKNAME,USER_LV,EXP) VALUES (2,'test1',1,0),(NULL,'test2',1,0),(NULL,'test3',1,0),(NULL,'test4',1,0),
(NULL,'test5',1,0),(NULL,'test6',1,0),(NULL,'test7',1,0),(NULL,'test8',1,0),
(NULL,'test9',1,0),(NULL,'test10',1,0),(NULL,'test11',1,0),(NULL,'test12',1,0);
SELECT LAST_INSERT_ID();
| LAST_INSERT_ID() |
| ---------------: |
| 3 |
INSERT INTO USER_TB VALUES (NULL,'test13',1,0),(NULL,'test14',1,0)
SELECT LAST_INSERT_ID();
| LAST_INSERT_ID() |
| ---------------: |
| 15 |
SELECT * FROM USER_TB;
ID | NICKNAME | USER_LV | EXP
-: | :------- | ------: | --:
2 | test1 | 1 | 0
3 | test2 | 1 | 0
4 | test3 | 1 | 0
5 | test4 | 1 | 0
6 | test5 | 1 | 0
7 | test6 | 1 | 0
8 | test7 | 1 | 0
9 | test8 | 1 | 0
10 | test9 | 1 | 0
11 | test10 | 1 | 0
12 | test11 | 1 | 0
13 | test12 | 1 | 0
15 | test13 | 1 | 0
16 | test14 | 1 | 0