李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 中间件
  3. 正文

MySQL 的自增 ID 用完了,怎么办?

2021年3月30日 201 0 0
本文最后更新于 2025年11月20日,距今已 351 天,其中的信息可能已经发生变化,请注意甄别。

有一个奇怪的问题,假如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了,当想再尝试插入一条数据时,得到了下面的异常结果:

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,存在主键冲突的可能性。

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

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

MySQL 的自增 ID 用完了,怎么办?

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: MySQL 数据库
最后更新:2025年11月20日

岁月同一天 11 月 7 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月7日
    DeepSeek本地部署全攻略:从环境搭建到高级应用,打造专属 AI 助手

    DeepSeek 作为国产开源大模型的佼佼者,凭借出色的推理能力、代码生成效率和中文支持,成为很多开发者本地部署的首选。…

相关文章
  • 还不懂Redis?看完这个故事就明白了!2020年10月19日
  • 为什么MySQL要“小表驱动大表”2025年11月4日
  • 数据库事务的隔离级别2021年6月2日
  • 高性能场景为什么推荐使用PostgreSQL,而非MySQL?2025年10月11日
  • MySQL数据库详解——执行SQL查询语句时,其底层到底经历了什么?2019年12月22日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

一天小明去上班,公司在公墓附近。
起晚了,不能吃饭,赶紧打车,“师傅,去公墓。”
在清晨的迷雾中,师傅感觉身上冷飕飕的。
眼看快迟到了,小明一把抓住司机的肩膀:“快点快点,天就要亮了。”
司机当场晕了。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了给服务器加了WAF游本昌去世关于主题加载速度优化的一点儿小演进
每日早报 · 2026年8月19日 Java中PO、VO、BO、DTO、POJO、DAO释义 JDK 25 LTS 深度解析:18 项特性如何重塑 Java 开发体验 Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法 从入门到精通:Qwen3-Coder 终端全攻略(环境搭建、高阶用法、实战案例详解) 试了下壁挂炉供暖
最近评论
fairy 发布于 5 小时前(11月06日) 机器人快来我这里吧!
李锋镝 发布于 5 小时前(11月06日) 都是机器人,防不住
李锋镝 发布于 5 小时前(11月06日) 是的,太烦了
李锋镝 发布于 5 小时前(11月06日) 可以同一台服务器
fairy 发布于 6 小时前(11月06日) 这流量,好厉害啊。我一年都没那么多
标签聚合
K8s AI编程 JAVA AI 日常 WordPress 架构 Spring 分布式 ElasticSearch 多线程 Claude SpringBoot JVM Redis MySQL 数据库 IDEA Theme SQL
友情链接
  • 志文工作室
  • Honesty
  • 韩小韩博客
  • 刘永博客
  • 哥斯拉
  • 韩情脉脉
  • 九仞之行
  • 彬红茶日记
  • 知向前端
  • 搬砖日记
  • 老张博客
  • 瓦匠个人小站
  • 皮皮社
  • 懋和道人
  • lijie blog
  • Serendipity
  • sssr7844的博客
  • 林羽凡
  • Mr.Sun的博客

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com 十年之约虫洞

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号