这个问题其实可以分为有主键 & 无主键两种情况回答。

国际惯例,先上张脑图:

02 有主键
如果你的表有主键,并且把主键设置为自增。

在 MySQL 中,一般会把主键设置成 int 型。而 MySQL 中 int 型占用 4 个字节,作为有符号位的话范围就是 [-231,231-1],也就是[-2147483648,2147483647];无符号位的话最大值就是 2^32-1,也就是 4294967295。

下面以有符号位创建一张表:

CREATE TABLE IF NOT EXISTS `t`(`id` INT(11) NOT NULL AUTO_INCREMENT,`url` VARCHAR(64) NOT NULL,PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

插入一个 id 为最大值 2147483647 的值,如下图所示:

如果此时继续下面的插入语句:

INSERT INTO t (url) VALUES ('wwww.javafish.top/article/erwt/spring')
复制代码

结果就会造成主键冲突:

2.1 解决方案
虽说 int 4 个字节,最大数据量能存储 21 亿。你可能会觉得这么大的容量,应该不至于用完。但是互联网时代,每天都产生大量的数据,这是很有可能达到的。

所以,我们的解决方案是:把主键类型改为 bigint,也就是 8 个字节。这样能存储的最大数据量就是 2^64-1,我也数不清有多少了。反正在你有生之年应该是够用的。

PS:单表 21 亿的数据量显然不现实,一般来说数据量达到 500 万就该分表了。

03 没主键
另一种情况就是建表时没设置主键。这种情况,InnoDB 会自动帮你创建一个不可见的、长度为 6 字节的 row_id,默认是无符号的,所以最大长度是 2^48-1。

实际上 InnoDB 维护了一个全局的 dictsys.row_id,所以未定义主键的表都共享该 row_id,并不是单表独享。每次插入一条数据,都把全局 row_id 当成主键 id,然后全局 row_id 加 1。

这种情况的数据库自增 ID 用完会发生什么呢?

1、创建一张无显示设置主键的表 t:

CREATE TABLE IF NOT EXISTS `t`(`age` int(4) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

2、通过 ps -ef|grep mysql 命令获取 mysql 的进程 ID,然后执行命令,通过 gdb 先把 row_id 修改为 1。PS:没有 gdb 的,百度安装下

sudo gdb -p 16111 -ex 'p dict_sys->row_id=1' -batch
复制代码

出现下图就是没错的:

3、插入三条数据:

insert into t(age) values(1);
insert into t(age) values(2);
insert into t(age) values(3);
复制代码

此时的数据库数据:

4、gdb 把 row_id 修改为最大值:281474976710656

sudo gdb -p 16111 -ex 'p dict_sys->row_id=281474976710656' -batch
复制代码

5、再插入三条数据:

insert into t(age) values(4);
insert into t(age) values(5);
insert into t(age) values(6);
复制代码

此时的数据库数据:

分析:

刚开始设置 row_id 为 1,插入三条数据 1、2、3 的 row_id 也理应是 1、2、3;这是没问题的。

接着设置 row_id 为最大值,紧跟着插入三条数据。这时的数据库结果是:4、5、6、3;你会发现 1、2 被覆盖了。

row_id 达到后最大值后插入的值 4、5、6 的 row_id 分别是 0、1、2;由于 row_id 为 1、2 的值已存在,所以后者的值 5、6 会覆盖掉 row_id 为 1、2 的值。

结论:row_id 达到最大值后会从 0 重新开始算;前面插入的数据就会被后插入的数据覆盖,且不会报错。

04 总结
数据库自增主键用完后分两种情况:

有主键,报主键冲突
无主键,InnDB 会自动生成一个全局的row_id。它到达最大值后会从 0 开始算,遇到 row_id 一样时,新数据覆盖旧数据。所以,我们还是尽量给表设置主键。
最后
如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: https://gitee.com/ZhongBangKeJi/CRMEB不胜感激 !

数据库自增 ID 用完了会咋样?相关推荐

  1. 8年面试官问到:数据库自增 ID 用完了会咋样?

    有主键 如果你的表有主键,并且把主键设置为自增. 在 MySQL 中,一般会把主键设置成 int 型.而 MySQL 中 int 型占用 4 个字节,作为有符号位的话范围就是 [-2^31,2^31- ...

  2. mysql id会用完吗_数据库自增ID用完了会怎样?

    起步 对DBA来说这应该是送分题吧.而我是突如其来的想法想测试下的.正常来说程序员是不会关心自增ID用完的情况的. 以 Mysql 为例,它支持的最大的整型是 unsigned bigint,上限是 ...

  3. 修改自增主键初始化_数据库自增ID用完了会怎么样?

    看到这个问题,我想起当初玩魔兽世界的时候,25H难度的脑残吼的血量已经超过了21亿,所以那时候副本的BOSS都设计成了转阶段.回血的模式,因为魔兽的血量是int型,不能超过2^32大小. 估计暴雪的设 ...

  4. android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...

    点击上方"码之初"关注,···选择"设为星标" 与精品技术文章不期而遇 在之前有篇文章中,和大家探讨了在MySOL数据库中,一个表的自增id用完,再插入数据有什 ...

  5. 记一次MySQL自增ID用完了怎么办

    记一次MySQL自增ID用尽后引发的错误 MySQL自增ID用完了一般分两种情况,第一种情况是MySQL表有主键:第二种情况是MySQL表没有主键. 1. 有主键 通常,我们设置主键的的时候一般都会把 ...

  6. 解决数据库自增ID的问题

    (1)设置主键自增为何不可取 这样的话,数据库本身是单点,不可拆库,因为id会重复. (2)依赖数据库自增机制达到全局ID唯一 使用如下语句: REPLACE INTO Tickets64 (stub ...

  7. mysql主键用完了怎么办_MySQL 自增 ID 用完了怎么办?

    MySQL 自增 ID 用完了怎么办? 在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突 ...

  8. MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗

    数据库自增ID机制原理介绍 在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的.这里的replace数据库自增ID和mysql数据 ...

  9. mysql自增id用完了_MySQL表自增id用完了该怎么办?

    我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的, ...

  10. mysql自增id用完了_MySQL 自增 ID 用完了怎么办?

    MySQL 自增 ID 用完了怎么办? 在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突 ...

最新文章

  1. 流量不够用?Facebook要帮你发现附近的免费WiFi
  2. HDU-1069-Monkey and Banana
  3. android 去掉蓝牙传输文件功能_iPhone还在用蓝牙传输照片?这个功能更好用还快哟,了解一下...
  4. The superclass javax.servlet.http.HttpServlet was not found 问题解决
  5. 有没有必要开项目周会
  6. Qt第三方库QCustomPlot——认识图表的各个部分
  7. 判断语句_判断和语句?
  8. 百练4148:生理周期
  9. 分类检测分割中的损失函数和评价指标
  10. POSIX和SYSTEM的消息队列应该注意的问题
  11. 计算与推断思维 三、Python 编程
  12. 操作系统概念学习笔记 4 操作系统结构和操作简述
  13. pear php有什么用?,php – PEAR和PEAR2有什么区别?
  14. fscanf()函数详解
  15. 10、Linux上常见软件的安装:安装JDK、安装Tomcat、安装Eclipse
  16. 百度搜索引擎优化入门篇——来自百度的一封信
  17. 人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment
  18. 送一台高配电脑,吃鸡贼爽!
  19. 致那些徘徊在测试界的屌丝
  20. 深度探索Hyperledger技术与应用之超级账本的典型交易流程

热门文章

  1. 英语四级和计算机一级算多少学分,英语四级几分过 英语四级426分过了吗。
  2. 仿苹果手机_仿iphone12充电动画下载-仿iphone12充电动画软件下载 v1.1
  3. 仿ios相机apk_iCamera摄像头下载|iCamera仿苹果相机安卓版v4.0下载 _当游网
  4. 找不到Break键怎么Quit / 退出服务CTRL-BREAK怎么输入啊?/ 笔记本键盘上没有break键
  5. 亚马逊智能音箱无故发出笑声,多名用户被吓尿
  6. 蓝桥杯 历届试题 史丰收速算
  7. 微信小程序云开发之简单两步实现集成赞赏加群弹窗功能
  8. 计算机键盘突然失灵,笔记本键盘突然用不了怎么办_笔记本键盘突然失灵怎么回事-win7之家...
  9. 前端作业(一)——我在《世纪佳缘注册页面》作业中遇到的问题
  10. 打开注册表regedit