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

 更新时间:2021年11月30日 16:35:01   作者:code1Boy  
本文主要介绍了Mysql更新自增主键id遇到的问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>

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

为什么要更新自增id

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

问题

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

图1:更新前原始数据

原始数据

执行更新语句

update test set id = 10 where id = 2;

图2:更新后的数据

更新后数据

执行新的插入语句

insert test (name) values ('dddd')

图3:插入的新数据

插入新数据后

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

如何解决

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

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

操作后如图:

指定id插入

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

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

对照结果

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

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

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

相关文章

  • MySQL 字符串日期格式转换的几种方法

    MySQL 字符串日期格式转换的几种方法

    MySQL经常需要将字符串类型的日期转换成日期或时间类型,本文主要介绍了MySQL 字符串日期格式转换的几种方法,包括使用STR_TO_DATE()和DATE_FORMAT()函数,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • 几个常见的MySQL的可优化点归纳总结

    几个常见的MySQL的可优化点归纳总结

    这篇文章主要介绍了几个常见的MySQL的可优化点归纳总结,包括在编程时处理索引、分页以及数据类型时可用到的地方,需要的朋友可以参考下
    2015-05-05
  • 超简单的qps统计方法(推荐)

    超简单的qps统计方法(推荐)

    下面小编就为大家带来一篇超简单的qps统计方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL中Join的算法(NLJ、BNL、BKA)详解

    MySQL中Join的算法(NLJ、BNL、BKA)详解

    这篇文章主要介绍了MySQL中Join的算法(NLJ、BNL、BKA)详解,Join是MySQL中最常见的查询操作之一,用于从多个表中获取数据并将它们组合在一起,本文将探讨这两种算法的工作原理,以及如何在MySQL中使用它们
    2023-07-07
  • mysql5.7.14解压版的安装图文教程

    mysql5.7.14解压版的安装图文教程

    MySQL的安装有两种方式,一种为msi格式,一个是zip格式。这篇文章主要介绍了mysql5.7.14解压版的安装图文教程,需要的朋友可以参考下
    2017-05-05
  • mysql 月份查询该月有付款的数据

    mysql 月份查询该月有付款的数据

    mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)
    2010-04-04
  • mysql非主键自增长用法实例分析

    mysql非主键自增长用法实例分析

    这篇文章主要介绍了mysql非主键自增长用法,结合实例形式分析了MySQL非主键自增长的基本设置、使用方法与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • MYSQL造数据占用临时表空间的解决方法

    MYSQL造数据占用临时表空间的解决方法

    在MySQL中,临时表空间并不是一个可以直接删除的文件或目录,因为临时表空间通常是由MySQL服务器在运行时根据需要自动创建和管理的,这篇文章主要介绍了MYSQL造数据占用临时表空间,需要的朋友可以参考下
    2024-05-05
  • linux下mysql链接被防火墙阻止的解决方法

    linux下mysql链接被防火墙阻止的解决方法

    linux下安装了mysql,不能从其它机器访问 帐号已经授权从任意主机进行访问
    2012-07-07
  • mysqldump你可能不知道的参数

    mysqldump你可能不知道的参数

    这篇文章主要介绍了mysqldump你可能不知道的参数,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11

最新评论