Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行MySQL批量插入查询后,自动增量id字段不是add 1_Mysql - Fatal编程技术网

执行MySQL批量插入查询后,自动增量id字段不是add 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

在测试我制作的用户表时,我发现了一些奇怪的东西。 如下图所示,在执行批量插入多个用户的查询后添加单行时,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) 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