zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

数据库自增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,并覆盖前面的数据。