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 没有错误信息,所有语句就在上面。
接近 2 年之前 回复
u014515303
u014515303   2016.09.09 17:32

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

lpsky0865
lpsky0865 那可不成,我需要自增列依次增加
接近 2 年之前 回复
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时没有问题
接近 2 年之前 回复
lpsky0865
lpsky0865 加了之后,问题依然存在。
接近 2 年之前 回复
qq_35994257
qq_35994257   2016.09.12 10:27

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

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

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

lpsky0865
lpsky0865 没有删除操作
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
使用mysql插入数据时,对于自增字段的处理
在使用mysql数据库插入数据时,假如我们的主键自增,在后台编写代码时需要注意下面的情况: 先看下面一段代码: try{ Class.forName(driverName); }catch (ClassNotFoundException e){ e.printStackTrace(); } java.sql.Connection conn = null; Prepa
MYSQL 中利用insert对自增字段进行插值
mysql的insert/replace/update/delete & insert,update,delete多表操作 2008-03-28 15:44:10 from WriteDream INSERT和REPLACE语句的功能都是向表中插入新的数据。这两条语句的语法类似。它们的主要区别是如何处理重复的数据。 1. INSERT的一般用法 MySQL中的INSERT语句和标准的I
mysql插入数据,获取最新插入的ID(自增列)
在MySQL中,使用auto_increment类型的id字段作为表的主键。通常的做法,是通过“select max(id) from tablename”的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表以“X锁“,待获得max(id)的值以后,再解锁。     这种做法需要的步骤比较多,有些麻烦,而且并发性也不好。有没有更简单的做法呢?答案之一是通过select LAS
有自增列时往里面添加批量字段,插入不进去的处理方法
先写一行 SET IDENTITY_INSERT 表名 ON 然后就可以忽视自增列这一限制 插入完数据记得关闭   SET IDENTITY_INSERT 表名 OFF
mysql查询实现插入自增列
Mysql中实现查询是插入自增列: SELECT (@row_number:=@row_number + 1) AS num, firstName, lastName FROM employees,(SELECT @row_number:=0) AS t order by num DESC;
mysql insert into select插入表中的数据与select的数据不一样
同一个动态拼接sql的写法: 使用变量拼接sql的受影响的行为6881(错误), 不使用变量动态拼接sql的受影响的行为6916(正确)。 最后发现是用变量拼接sql中变量中有单引号影响了结果。 用双引号包住sql,问题消失。错误: set @monthTime=DATE_FORMAT(now(),'%Y%m'); set @clientTime_1=date_format(date_sub
MySQL数据表中有自增长主键时如何插入数据
MySQL数据库表中有自增主键ID,当用SQL插入语句中插入语句带有ID列值记录的时候; 如果指定了该列的值,则新插入的值不能和已有的值重复,而且必须大于其中最大的一个值; 也可以不指定该列的值,只将其他列的值插入,让ID还是按照MySQL自增自己填; 具体:1.创建数据库 create table if not exists userInfo ( id int PRIMARY KEY AUTO_I
mysql 使用select插入多条数据,insert into (1,2,3,4,)select(1,2,3,4)
SET @yesterday = CURDATE() - INTERVAL n DAY; # 前N天的日期,n通常为1,即昨天 INSERT IGNORE mob_report.day_coupon_report ( mdate, id, day_release_coupon_count, day_writeoff_coupo
mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法   mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得到这个自增id的值呢?   方法一:是使用last_insert_id mysql> SELECT LAST_INSERT_ID();     产生的ID 每次连接后保存在
mysql常用语句——结合select的insert语句
1、insert into select语句 2、select into from 语句