写点什么

数据库自增 ID 用完了会怎样

作者:喵叔
  • 2021 年 11 月 12 日
  • 本文字数:885 字

    阅读完需:约 3 分钟

我在工作中经常会遇到有人问我,数据库表的 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,并覆盖前面的数据。

发布于: 5 小时前阅读数: 5
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
数据库自增ID用完了会怎样