数据库自增ID用完了会怎样
2023-03-14 22:42:22 时间
我在工作中经常会遇到有人问我,数据库表的ID是自增的,那么如果ID用完了会怎么样?说实话,我一直从事的是政企行业的开发,因为是传统行业,并且数据量基本上增长缓慢,所以到目前为止我还没遇到过自增ID用完的情况。因此我连夜做了实验,并编写了这篇文章将结果分享出来。在这里我会从两个方面来分享:有主键和无主键。(全文以MySQL为例,因为MySQL最常用)
一、有主键
在MySQL中int类型占4个字符,因为自增ID大部分都是以1开始,所以它的取值范围为1到2^32-1,也就是1到4294967295。首先我们创建一张表,并设置ID自增,且从2147483647开始。
Tip:2147483647是int类型主键的上线
CREATE TABLE `test1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test` varchar(32) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2147483647 DEFAULT CHARSET=utf8mb4;
接着插入一条数据
insert into test1(test) values('hi');
我们再次插入一条数据,这时MySQL会提示错误:
1062 - Duplicate entry '2147483647' for key 'PRIMARY', Time: 0.000000s。
从这里得知,在有主键且主键自增的情况下,ID达到上限后MySQL会报错。
二、无主键
在MySQL中如果没有主键,InnoDB会为我们自动创建一个row_id,row_id为6字节并且最大长度为2^48-1。同理我们创建一张表:
CREATE TABLE `test2` (
`test` varchar(32) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
接着我们修改row_id为1,并插入5条数据
insert into test2(test) values('n1');
insert into test2(test) values('n2');
insert into test2(test) values('n3');
insert into test2(test) values('n4');
insert into test2(test) values('n5');
再次修改row_id为281474976710656,并再次插入数据:
insert into test2(test) values('n6');
insert into test2(test) values('n7');
insert into test2(test) values('n8');
最后我们查看所有数据,发现修改row_id为上限值钱的n1和n2被后来插入的n7和n8数据覆盖了,n6排在了所有数据的最前面。这是因为row_id达到上限后,再次插入数据的话row_id会重置为0,并覆盖前面的数据。
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地