laoluo1991 发表于 2016-9-5 10:22:15

Mysql Insert into进行表之间数据复制的时候出现自增错误

表的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
)执行结果
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。不知道为啥出现了这样的问题,加个 limit x,1 的话 insert 一条一条的插入又不会出现错误,但是这样把多条查询结果一起插进去的话就会出现。我做了一些小测试,不知道是否有用。
我把表清空,自增恢复到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另外,在插入数量大的时候,一次插入5000条和一次插入6000条,AUTO_INCREMENT竟然都是8192,感觉好诡异了

fcy_n 发表于 2017-4-6 17:52:55

这是正常的,默认的innodb自增字段值是预分配的,通过记录数量决定是分配2的N次值
页: [1]
查看完整版本: Mysql Insert into进行表之间数据复制的时候出现自增错误