千家信息网

MySQL的自增ID用完了怎么办

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这篇文章主要介绍"MySQL的自增ID用完了怎么办",在日常操作中,相信很多人在MySQL的自增ID用完了怎么办问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MySQL
千家信息网最后更新 2025年02月04日MySQL的自增ID用完了怎么办

这篇文章主要介绍"MySQL的自增ID用完了怎么办",在日常操作中,相信很多人在MySQL的自增ID用完了怎么办问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"MySQL的自增ID用完了怎么办"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

既然这块知识点不清楚,那回头就自己动手实践下。

首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。

create table t0(id int unsigned auto_increment primary key) ;insert into t0 values(null);

通过show命令 show create table t0; 查看表情况

CREATE TABLE `t0` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

可以发现 AUTO_INCREMENT 已经自动变成2,这离用完还有很远,我们可以算下最大当前声明的自增ID最大是多少,由于这里定义的是 intunsigned,所以最大可以达到2的32幂次方 - 1 = 4294967295

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

create table t1(id int unsigned auto_increment primary key)  auto_increment = 4294967295;insert into t1 values(null);

同样,通过show命令,查看t1的表结构

CREATE TABLE `t1` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8

可以发现,AUTO_INCREMENT已经变成4294967295了,当想再尝试插入一条数据时,得到了下面的异常结果

17:28:03    insert into t1 values(null) Error Code: 1062. Duplicate entry '4294967295' for key 'PRIMARY'    0.00054 sec

明,当再次插入时,使用的自增ID还是 4294967295,报主键冲突的错误。

4294967295,这个数字已经可以应付大部分的场景了,如果你的服务会经常性的插入和删除数据的话,还是存在用完的风险,建议采用bigint unsigned,这个数字就大了。

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

如果是这种情况,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,存在主键冲突的可能性。

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


到此,关于"MySQL的自增ID用完了怎么办"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

怎么办 全局 数据 完了 学习 最大 情况 命令 字节 数字 时候 更多 知识 结果 还是 问题 冲突 实践 帮助 实用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器登陆密码忘记 买服务器和域名吗 卓越网络技术有限公司 软件开发笔记本内存多大合适 信息系统与网络技术考题 计算机网络技术的坑 违反网络安全管理制度 怀旧服骨火服务器人口统计 全校大学生网络安全知识竞赛 大一计算机网络技术背诵点 全球adr数据库哪一年建立 弓箭手大作战服务器 互联网科技 文献综述 php日志服务器软件 嵌入式软件开发工程师35岁 公司网络安全实行统一管理 数据库查询并且是什么 惠普官网服务器主板型号怎么查看 为什么进入游戏看不到服务器 政务微信的服务器是什么 如何进入电子邮件服务器 合作软件开发的优势 移动办公应用网络安全域 物业公司网络安全员 美国太空网络技术 坪山区品质网络技术开发价格多少 国外最好的服务器多少钱一个月 网络安全生产新纪元 数据库工程师技能 织梦数据库直接恢复工具
0