2 lpsky0865 lpsky0865 于 2016.09.09 16:12 提问

mysql 使用insert into ...select 的方式插入数据,自增列出现问题 3C

使用insert into table ....select ...的方式插入数据后,table的自增列的值比插入条数要多很多。
例子:

CREATE TABLE test (
  jid int(10) unsigned NOT NULL AUTO_INCREMENT,
  jnum int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (jid)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- now: auto_increment = 1

INSERT INTO test(jnum) VALUES (1);
INSERT INTO test(jnum) VALUES (2);

-- now: auto_increment = 3 

truncate table test ;
-- now: auto_increment = 1

INSERT INTO test(jnum)
select 1 union
select 2 ;

-- now: auto_increment = 4


5个回答

Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.09 17:25

额,错误原因不是很明显啊。希望你能提供更多的出错信息。

lpsky0865
lpsky0865 没有错误信息,所有语句就在上面。
大约一年之前 回复
u014515303
u014515303   2016.09.09 17:32

不用管自增的id,直接添加其他元素,自增列会自动增加,

lpsky0865
lpsky0865 那可不成,我需要自增列依次增加
大约一年之前 回复
zhuzige521888
zhuzige521888   2016.09.09 18:02

正规写法时建议写上 from dual,因为操作复杂后数据库不容易分辨是否是默认的dual表了,所以不写很容易出错,建议加上!
INSERT INTO test(jnum)
select 1 from dual union
select 2 from dual;

zhuzige521888
zhuzige521888 回复颠颠颠: 这应该是MySql的一个bug,只有两个union时没有问题
大约一年之前 回复
lpsky0865
lpsky0865 加了之后,问题依然存在。
大约一年之前 回复
qq_35994257
qq_35994257   2016.09.12 10:27

因为你的自增器以前用过,他是在原来的基础上增加的,所以不是从1开始的,如果你想从1开始的话,
可以重新建个自增器,这样就是从1开始了。自增器中即使你删除了数据,它的自增ID也会在删掉的基础上进行,不会变小。

lpsky0865
lpsky0865 回复qq_35994257: 你没有仔细看我的sql语句。
大约一年之前 回复
qq_35994257
qq_35994257 回复颠颠颠: 你把表的所有记录都删掉了,那就肯定什么也没有啦,只剩表结构了
大约一年之前 回复
lpsky0865
lpsky0865 表truncate 之后,变成1, 验证过了。
大约一年之前 回复
maer2003
maer2003   2016.09.14 15:56

由于数据有删除操作,就会出现自增值比记录数大。

lpsky0865
lpsky0865 没有删除操作
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片