服务器之家

服务器之家 > 正文

Mysql更新自增主键id遇到的问题

时间:2022-01-12 18:19     来源/作者:code1Boy

本是一个自己知道的问题,还是差点踩坑(差点忘了,还好上线前整理上线点时想起来了),特此记录下来

为什么要更新自增id

我是因为历史业务上的坑,导致必须更新一批id,且为了避免冲突需要将id扩大多少倍进行更新,因为我这个表的数据数量不高,属于高读低写的情况,所以就简单的扩大了1000

问题

mysql中如果我们把自增主键更新为更大的值(例如现在自增id最大值是1000,你更新id=49这个记录到id=1049),mysql并不会把表的自增值修改为更新后的值,在某些情况下,如ddl,重启等之后,业务开始报错,这时如果不知道当前操作可能会误认为是当前业务操作的问题,实则是因为更新id埋下的坑(主键冲突)
如下图:

图1:更新前原始数据

Mysql更新自增主键id遇到的问题

执行更新语句

?
1
update test set id = 10 where id = 2;

图2:更新后的数据

Mysql更新自增主键id遇到的问题

执行新的插入语句

?
1
insert test (name) values ('dddd')

图3:插入的新数据

Mysql更新自增主键id遇到的问题

想必这时大家也都看出问题了,更新后可能刚开始没有问题,但当自增id追上你更新的最大值后,id冲突在所难免了。。。

如何解决

1.如果是个人测试库,不怎么重要,可以重启数据库
2.当然线上数据库是没法按照1这种方式搞了,除非你很任性(还需要dba陪着你任性),,,这时可以尝试指定id插入一条业务上无意义的数据,例如软删除的数据,(我的案列表没有软删除标识,大家可以意会下)

?
1
insert test (id,name) values (20,'eeee');

操作后如图:

Mysql更新自增主键id遇到的问题

在执行下面sql语句,对照结果

?
1
insert test (name) values ('ffff');

Mysql更新自增主键id遇到的问题

此时自增id已从最大值开始自增了

找资料发现,这个bug在2005年就被提出了,因为性能以及场景很少的没有被修复;这个问题在mysql 8.0.11中表现正常。

到此这篇关于mysql更新自增主键id遇到的问题的文章就介绍到这了,更多相关mysql更新自增主键id内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/code1Boy/article/details/121589152

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部