数据库自增 ID 用完了会咋样?
这个问题其实可以分为有主键 & 无主键两种情况回答。
国际惯例,先上张脑图:
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 用完了会咋样?相关推荐
- 8年面试官问到:数据库自增 ID 用完了会咋样?
有主键 如果你的表有主键,并且把主键设置为自增. 在 MySQL 中,一般会把主键设置成 int 型.而 MySQL 中 int 型占用 4 个字节,作为有符号位的话范围就是 [-2^31,2^31- ...
- mysql id会用完吗_数据库自增ID用完了会怎样?
起步 对DBA来说这应该是送分题吧.而我是突如其来的想法想测试下的.正常来说程序员是不会关心自增ID用完的情况的. 以 Mysql 为例,它支持的最大的整型是 unsigned bigint,上限是 ...
- 修改自增主键初始化_数据库自增ID用完了会怎么样?
看到这个问题,我想起当初玩魔兽世界的时候,25H难度的脑残吼的血量已经超过了21亿,所以那时候副本的BOSS都设计成了转阶段.回血的模式,因为魔兽的血量是int型,不能超过2^32大小. 估计暴雪的设 ...
- android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...
点击上方"码之初"关注,···选择"设为星标" 与精品技术文章不期而遇 在之前有篇文章中,和大家探讨了在MySOL数据库中,一个表的自增id用完,再插入数据有什 ...
- 记一次MySQL自增ID用完了怎么办
记一次MySQL自增ID用尽后引发的错误 MySQL自增ID用完了一般分两种情况,第一种情况是MySQL表有主键:第二种情况是MySQL表没有主键. 1. 有主键 通常,我们设置主键的的时候一般都会把 ...
- 解决数据库自增ID的问题
(1)设置主键自增为何不可取 这样的话,数据库本身是单点,不可拆库,因为id会重复. (2)依赖数据库自增机制达到全局ID唯一 使用如下语句: REPLACE INTO Tickets64 (stub ...
- mysql主键用完了怎么办_MySQL 自增 ID 用完了怎么办?
MySQL 自增 ID 用完了怎么办? 在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突 ...
- MySQL分布式ID_分布式唯一ID系列(3)——数据库自增ID机制适合做分布式ID吗
数据库自增ID机制原理介绍 在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的.这里的replace数据库自增ID和mysql数据 ...
- mysql自增id用完了_MySQL表自增id用完了该怎么办?
我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的, ...
- mysql自增id用完了_MySQL 自增 ID 用完了怎么办?
MySQL 自增 ID 用完了怎么办? 在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突 ...
最新文章
- 流量不够用?Facebook要帮你发现附近的免费WiFi
- HDU-1069-Monkey and Banana
- android 去掉蓝牙传输文件功能_iPhone还在用蓝牙传输照片?这个功能更好用还快哟,了解一下...
- The superclass javax.servlet.http.HttpServlet was not found 问题解决
- 有没有必要开项目周会
- Qt第三方库QCustomPlot——认识图表的各个部分
- 判断语句_判断和语句?
- 百练4148:生理周期
- 分类检测分割中的损失函数和评价指标
- POSIX和SYSTEM的消息队列应该注意的问题
- 计算与推断思维 三、Python 编程
- 操作系统概念学习笔记 4 操作系统结构和操作简述
- pear php有什么用?,php – PEAR和PEAR2有什么区别?
- fscanf()函数详解
- 10、Linux上常见软件的安装:安装JDK、安装Tomcat、安装Eclipse
- 百度搜索引擎优化入门篇——来自百度的一封信
- 人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment
- 送一台高配电脑,吃鸡贼爽!
- 致那些徘徊在测试界的屌丝
- 深度探索Hyperledger技术与应用之超级账本的典型交易流程
热门文章
- 英语四级和计算机一级算多少学分,英语四级几分过 英语四级426分过了吗。
- 仿苹果手机_仿iphone12充电动画下载-仿iphone12充电动画软件下载 v1.1
- 仿ios相机apk_iCamera摄像头下载|iCamera仿苹果相机安卓版v4.0下载 _当游网
- 找不到Break键怎么Quit / 退出服务CTRL-BREAK怎么输入啊?/ 笔记本键盘上没有break键
- 亚马逊智能音箱无故发出笑声,多名用户被吓尿
- 蓝桥杯 历届试题 史丰收速算
- 微信小程序云开发之简单两步实现集成赞赏加群弹窗功能
- 计算机键盘突然失灵,笔记本键盘突然用不了怎么办_笔记本键盘突然失灵怎么回事-win7之家...
- 前端作业(一)——我在《世纪佳缘注册页面》作业中遇到的问题
- 打开注册表regedit