我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL的自增ID(主键) 用完了的解决方法

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL的自增ID(主键) 用完了的解决方法

在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值。一般情况下初始值都是从 0 开始,然后按照一定的步长增加(一般是自增 1)。一般情况下,我们都是用int(11)来作为数据表的自增 ID,在 MySQL 中只要定义了这个数的字节长度,那么就会有上限。

MySQL的自增ID(主键) 用完了,怎么办?

如果用 int unsigned (int,4个字节 ), 我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 int unsigned,所以最大可以达到2的32幂次方 - 1 = 4294967295。

这里有个小技巧,可以在创建表的时候,直接声明AUTO_INCREMENT的初始值为4294967295。


create table `test` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967295;

SQL插入语句


insert into `test` values (null);

当想再尝试插入一条数据时,得到了下面的异常结果。


[SQL] insert into `test` values (null);
[Err] 1062 - Duplicate entry '4294967295' for key 'PRIMARY'

说明,当再次插入时,使用的自增ID还是 4294967295,报主键冲突的错误,这说明 ID 值达到上限之后,就不会再变化了。4294967295,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险,建议采用 bigint unsigned ,这个数字就大了。

bigint unsigned 的范围是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字), 存储大小为 8 个字节。

不过,还存在另一种情况,如果在创建表没有显示申明主键,会怎么办?

如果是这种情况,InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id,而且InnoDB 维护了一个全局的 dictsys.row_id,所以未定义主键的表都共享该row_id,每次插入一条数据,都把全局row_id当成主键id,然后全局row_id加 1。

该全局row_id在代码实现上使用的是bigint unsigned类型,但实际上只给row_id留了6字节,这种设计就会存在一个问题:如果全局row_id一直涨,一直涨,直到2的48幂次-1时,这个时候再+1,row_id的低48位都为0,结果在插入新一行数据时,拿到的row_id就为0,存在主键冲突的可能性。

所以,为了避免这种隐患,每个表都需要定一个主键。

总结

数据库表的自增 ID 达到上限之后,再申请时它的值就不会在改变了,继续插入数据时会导致报主键冲突错误。因此在设计数据表时,尽量根据业务需求来选择合适的字段类型。

以上就是MySQL的自增ID(主键) 用完了的解决方法的详细内容,更多关于MySQL 自增ID(主键)的资料请关注自学编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL的自增ID(主键) 用完了的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL的自增ID(主键) 用完了的解决方法

在 MySQL 中用很多类型的自增 ID,每个自增 ID 都设置了初始值。一般情况下初始值都是从 0 开始,然后按照一定的步长增加(一般是自增 1)。一般情况下,我们都是用int(11)来作为数据表的自增 ID,在 MySQL 中只要定义了
2022-05-10

mysql自增长id用完了该如何解决

本篇内容介绍了“mysql自增长id用完了该如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql自增长id用完了,怎么办?作为一
2023-06-29

浅谈MySQL中的自增主键用完了怎么办

在面试中,大家应该经历过如下场景面试官:"用过mysql吧,你们是用自增主键还是UUID?" 你:"用的是自增主键" 面试官:"为什么是自增主键?" 你:"因为采用自增主键,数据在物理结构上是顺序存储,性能最好,bla
2022-05-21

MybatisPlus使用@TableId主键id自增长无效的解决

本文主要介绍了MybatisPlus使用@TableId主键id自增长无效的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-15

MySQL主键自增会遇到的坑及解决方法

目录1. 为什么不用 UUID2. 主键自增的问题2.1 数据插入的三种形式2.2 innodb_autoinc_lock_mode2.3 实践3. 小结在上篇文章中,松哥和小伙伴们分享了 mysql 的聚簇索引,也顺便和小伙伴们分析了为什
2023-04-20

如何解决Mysql更新自增主键id遇到的问题

这篇文章主要为大家展示了“如何解决Mysql更新自增主键id遇到的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Mysql更新自增主键id遇到的问题”这篇文章吧。为什么要更新自增id
2023-06-21

mysql创建表设置表主键id从1开始自增的解决方案

目录一.问题描述二.解决方案1.实现步骤2.演示总结一.问题描述当我们在做项目的时候,创建一张用户表,如何让该表的主键id从0开始自增?网上搜索了很多解决方案,最后发现了一种方法必实现且有效的方案。下面就来介绍实现方法二.解决方案1.
2023-04-19

mysql数据自增ID为2的解决方案

目录mysql数据自增ID为2问题mysql自增id理解1. 什么是自增id2php. 自增id的好处3. 自增id的坏处4. 当自增id用完了怎么办?总结mysql数据自增ID为2问题查看配置show variables like '
2022-12-27

PostgreSQL设置主键自增的方法详解

目录背景什么是序列PostgreSQL的自增机制基本使用使用SERIAL或BIGSERIAL数据类型手动创建序列和设置默认值实战demo:PostgreSQL 手动序列管理设置序列的当前值工作常用总结背景在使用mysql时,创建表结构时可
PostgreSQL设置主键自增的方法详解
2024-08-27

如何解决mysql的int型主键自增问题

这篇文章主要介绍“如何解决mysql的int型主键自增问题”,在日常操作中,相信很多人在如何解决mysql的int型主键自增问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决mysql的int型主键自
2023-06-20

MySQL数据库自增主键的间隔不为1的解决方式

目录mysql数据库自增主键的间隔不为1fvt测试环境数据库配置pr类生产环境数据库配置SQL语句中的auto_increment=1是什么意思?举个简单例子MySQL数据库自增主键的间隔不为1今天新版本上线的时候,遇到了一个这样的问题,
2022-12-27

编程热搜

目录