首页 > 数据库 >mysql的主键超过最大值会发生什么?

mysql的主键超过最大值会发生什么?

时间:2023-04-09 21:12:28浏览次数:39  
标签:最大值 主键 插入 报错 mysql 数据 id row

设置主键的情况下

在自增主键达到int64最大后,再次插入一行记录,报错如下:

Duplicate entry ‘4294967295’ for key ‘increment_id_test.PRIMARY’

唯一键冲突报错:当auto_incement达到上限后,再次申请下一个id时,得到的值保持不变。

在建表时,通常都会将主键id设置为8字节的bigint unsigned (2^64)
理论上,在并发够大,时间够长的情况下,还是有可能达到其上限,
但到目前为止,还没有一个mysql实例超过这个上限,实际中不会发生。

未设置主键的情况下

如果数据表没有设置主键,那么Innodb会给该表设置一个不可见,长度为6字节的默认主键row_id。
Innodb维护了一个全局的dict_sys.row_id值,它被所有无主键的数据表共同使用。
每个无主键的数据表插入一行数据,都会将当前dict_sys.row_id的值加1。

  1. row_id写入表中的值范围,是从0至2^48-1。
  2. 当row_id的值为2^48时,再进行数据插入,那么row_id的后6个字节的值,就全部为0了。

当row_id的值到了2^48次方-1后,再次插入数据,下一个值是0,然后开始循环。
不过和自定义主键不同的是,row_id标识的主键,没有唯一性约束。
当插入数据的row_id值,在表中已经存在,那么写入的数据会覆盖已存在的数据,且不会报错。

Innodb没有暴露出修改该值的接口和命令。

总结

在设计表时,最好还是使用自定义主键,而不要使用Innodb的默认主键。
至少在自定义主键的场景下,当自增id达到上限时,插入数据,系统会提示报错信息,而不是覆盖数据。
因为数据覆盖意味着数据丢失,影响的是数据可靠性,而插入失败产生的报错,影响是可用性。
在数据业务中,可靠性通常是优先于可用性。

标签:最大值,主键,插入,报错,mysql,数据,id,row
From: https://www.cnblogs.com/zhengbiyu/p/17301057.html

相关文章

  • SQL基础操作_3_数据字典(涵盖SQL Server、Oracle、Mysql常见系统数据字典)
    目录数据库元数据查询7.5.1列出模式中所有的表7.5.2列出所有的数据库7.5.3列出给定表的基本信息7.5.4列出给定表的索引信息7.5.5列出给定表的主键、外键约束7.5.6列出给定表的外键引用7.5.7列出给定表的检查约束7.5.8列出给定表的默认约束7.5.9列出给定表的所有约束7.5.10......
  • MySQL Cursor 的定义和使用
    前言最近项目中需要迁移数据,对旧表A的每一行记录处理后插入新表B。Google一下,发现MySQLCursor适合这种场景,上篇文章介绍了handler,那么本篇就一起看下Cursor是什么吧!本文基于MySQL8.0定义我们来看看ChatGPT是怎么理解MySQLCursor的吧:我:MySQLCursor是什么......
  • 爬虫最后一天,爬取到的数据存到mysql中,爬虫和下载中间件、加代理、cookie、header、se
    爬到的数据存到mysql中classFirstscrapyMySqlPipeline:defopen_spider(self,spider):print('我开了')self.conn=pymysql.connect(user='root',password="",host='127.0.0.1......
  • 多表查询和python操作mysql
    目录多表查询的两种方法方法1:连表操作方法2:子查询小知识点补充说明可视化软件NaviCat多表查询练习题1、查询所有的课程的名称以及对应的任课老师姓名2.查询平均成绩大于八十分的同学的姓名和平均成绩3.查询没有报李平老师课的学生姓名4.查询没有同时选修物理课程和体育课程的学生......
  • (已解决)安装PyMySQL出现问题--'pip' 不是内部或外部命令,也不是可运行的程序 或批处理文
    问题描述:输入cmd,进入命令窗口,输入pipinstallpymysql时候出现下面的问题: 然后进入python环境中去输入还是报错:问题原因:环境变量配置出错,cmd下无法调用pip程序。解决办法:①首先退出python环境,输入命令:exit() ②然后去电脑里面找到python的安装位置,如图类似这样的文件......
  • Navicat软件、python操作MySQL
    目录Navicat软件1.软件简介2.navicat基本操作python操作MySQL1.链接、执行sql、关闭(游标)2.查询结果3.增删改查4.使用pymysql写一个注册和登录的案例Navicat软件1.软件简介第三方开发的用来充当数据库客户端的简单快捷的操作界面 无论第三方软件有多么的花里胡哨,底层的本质还......
  • 讲解MySQL8.0备份与还原工具(mysqlbackup)
    一、安装mysqlbackup下载登录oracleedelivery,进入下载连接选择适合你系统的版本下载,在这里我使用的是银河麒麟KylinOSServerV10SP2,因此我选择一个通用的预编译二进制的tar包,如下图:没有Oracleedelivery账号的朋友可以到私信我索取软件安装包。安装[root@light]tarx......
  • mysql 查询练习题
    1.查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。selectd.deptno,d.dname,d.loc,r.countfromdeptd,(selectdeptno,count(*)countfromempgroupbydeptno)rwhered.deptno=r.deptno;2.列出薪金比smith高的所有员工。select*fro......
  • 力扣1077(MySQL)-项目员工Ⅲ(中等)
    题目:写一个SQL查询语句,报告在每一个项目中经验最丰富的雇员是谁。如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工。查询结果格式在以下示例中:   employee_id为1和3的员工在project_id为1的项目中拥有最丰富的经验。在project_id为2的项目......
  • 力扣1076(MySQL)-员工项目Ⅱ(简单)
    题目:编写一个SQL查询,报告所有雇员最多的项目。查询结果格式如下所示:  解题思路:方法一:将两个表联结,以project_id进行分组,统计员工数降序排序,然后筛选出第一条数据。1selectproject_id2fromprojecta3joinemployeeb4ona.employee_id=b.employee_id5group......