Mysql更新自增主键id遇到的问题
作者:code1Boy 发布时间:2024-01-17 23:56:02
标签:Mysql,自增主键id
本是一个自己知道的问题,还是差点踩坑(差点忘了,还好上线前整理上线点时想起来了),特此记录下来
为什么要更新自增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');
操作后如图:
在执行下面SQL语句,对照结果
insert test (name) values ('ffff');
此时自增id已从最大值开始自增了
找资料发现,这个BUG在2005年就被提出了,因为性能以及场景很少的没有被修复;这个问题在MySQL 8.0.11中表现正常。
来源:https://blog.csdn.net/code1Boy/article/details/121589152


猜你喜欢
- 源代码、参数及其意义:def sub(pattern, repl, string, count=0, flags=0): &n
- 许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures
- FTP即文件传输协议;它基于客户机-服务器模型体系结构,应用广泛。它有两个通道:一个命令通道和一个数据通道。命令通道用于控制通信,数据通道用
- 页面是这样的我尝试了很多次,都不响应。代码是这样的import xlrd###导入数据def read_data(workboo
- 数据库在高并发的场景下使用外键约束会有锁问题并且使用外键会增加运维成本,所以很多公司都规定生产环境的数据库禁止使用外键。那么不使用外键约束的
- 本文实例讲述了python实现根据主机名字获得所有ip地址的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: utf
- 本文汇总了python文件操作相关知识点。分享给大家供大家参考,具体如下:总是记不住API。昨晚写的时候用到了这些,但是没记住,于是就索性整
- 本文实例讲述了Python实现的根据文件名查找数据文件功能。分享给大家供大家参考,具体如下:#-*- coding: UTF-8 -*-im
- 阅读上一章:Chapter 10 应用CSSChapter 11 打印样式先前在第10章中,讨论了几种为文档应用CSS的方法,这一章是要研究
- 1、字符串(1)概念字符串英文名string,简称str。 字符串就是由一个个字符连接起来的组合, 你平时所见的字母、数
- 大数据预测是大数据最核心的应用,是它将传统意义的预测拓展到“现测”。大数据预测的优势体现在,它把一个非常困难的预测问题,转化为一个相对简单的
- 1 什么是嵌套循环所谓嵌套循环就是一个外循环的主体部分是一个内循环。内循环或外循环可以是任何类型,例如 while 循环或 for 循环。
- 将VS2017上配置OpenCV4.1.0的过程记录于此。准备工具:OpenCV:4.1.0IDE:VS2017安装环境:Win10 &nb
- 今天终于可以用wxPython开发GUI程序了,非常高兴。把其中的一些注意点写下来以供参考。在windows XP平台下,首先需要做以下环境
- 在python中可以通过内置函数int()函数进行二进制转十进制;int()函数可以将一个指定进制的数字型字符串或者十进制数字转化为整型。P
- 因为突然有个 * 的想法,想在自己的Android平板上面搭建一个DNS服务器,因为平板上之前安装过SL4A和Python的解释器,也想继续学
- 本文实例为大家分享了Python实现用户名和密码登录的具体代码,供大家参考,具体内容如下功能登录及注册,密码错误多次后验证码确认说明初次运行
- 概述Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展,Python的职位需求越来越高。下面我收集了10个Pyth
- 置信椭圆原理及椭圆图形绘制置信椭圆长短轴计算def confidence_oval(self,factor, ppf_rate): &nbs
- 本文实例讲述了Python实现二分查找算法的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env pythonimpo