NutzCN Logo
问答 Mysql Insert into进行表之间数据复制的时候出现自增错误
发布于 2791天前 作者 LuoYY 2131 次浏览 复制 上一个帖子 下一个帖子
标签:

表的SQL结构

-- ----------------------------
-- Table structure for t_ds
-- ----------------------------
DROP TABLE IF EXISTS `t_ds`;
CREATE TABLE `t_ds` (
  `id` bigint(64) NOT NULL AUTO_INCREMENT,
  `deviceId` varchar(50) DEFAULT NULL,
  `eventId` varchar(50) DEFAULT NULL,
  `eventTime` bigint(64) DEFAULT NULL,
  `logInfoId` bigint(64) DEFAULT NULL,
  `statusCode` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_ds` (`deviceId`,`eventId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

插入语句

INSERT INTO t_ds(deviceId, eventId, eventTime, logInfoId, statusCode)
SELECT deviceId, eventId, eventTime, id, statusCode FROM t_loginfo
WHERE (deviceId, eventId, eventTime) in (
  SELECT
		deviceId, eventId, MAX(eventTime)
	FROM
		t_loginfo
	GROUP BY deviceId, eventId
)

执行结果

[SQL]INSERT INTO t_ds(deviceId, eventId, eventTime, logInfoId, statusCode)
SELECT deviceId, eventId, eventTime, id, statusCode FROM t_loginfo
WHERE (deviceId, eventId, eventTime) in (
  SELECT
		deviceId, eventId, MAX(eventTime)
	FROM
		t_loginfo
	GROUP BY deviceId, eventId
)

受影响的行: 5504
时间: 2.882s

查看数据库发现插入成功,一共5504条记录,所有行的序列ID也是正常,但是这时候的自增已经到了8192, 这时候插入一条新纪录的ID为8192

7 回复

alter table 把自增的值改回去.

@wendal 我知道怎么改自增,但是想知道为啥出现了这样的问题,加个 limit x,1 的话 insert 一条一条的插入又不会出现错误,但是这样把多条查询结果一起插进去的话就会出现

5504跟8192看不出什么相关性...

@wendal 我做了一些小测试,不知道是否有用

我把表清空,自增恢复到1,然后运行下面语句

INSERT INTO t_ds(deviceId, eventId, eventTime, logInfoId, statusCode)
SELECT deviceId, eventId, eventTime, id, statusCode FROM t_loginfo
WHERE (deviceId, eventId, eventTime) in (
  SELECT
		deviceId, eventId, MAX(eventTime)
	FROM
		t_loginfo
	GROUP BY deviceId, eventId
)
limit 0,1

这时候 AUTO_INCREMENT=2

---
再修改

limit 1,2

这时候插入2条,实际记录为3条,最后一条记录ID为3,但是 AUTO_INCREMENT=5

---
再修改

limit 3,3

这时候插入3条,实际记录为6条,最后一条记录ID为7,但是 AUTO_INCREMENT=8

---
再修改

limit 6,4

这时候插入4条,实际记录为10条,最后一条记录ID为11,但是 AUTO_INCREMENT=15

---
再修改

limit 10,5

这时候插入5条,实际记录为15条,最后一条记录ID为19,但是 AUTO_INCREMENT=22


运行下来整个ID自增序列是这样的

1 2 3 5 6 7 8 9 10 11 15 16 17 18 19

@wendal 另外,今天在本机搭建的MySQL上进行测试,发现插入6787条也得到的是8192,感觉好诡异了

@luoyy 把数据精简一下,例如造一堆数据,仅仅id不一样

来自炫酷的 NutzCN

@wendal 问题依旧,我弄了个最简单的
两张表结构完全一样,eventId就是个简单的字符串,所有记录只有ID不一样

t_tmp_s: id, eventid
t_tmp: id, eventid
INSERT INTO t_tmp_s(eventId)
SELECT eventId FROM t_tmp

不管是5000条还是6000条,AUTO_INCREMENT 始终都是8192

添加回复
请先登陆
回到顶部