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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库自增ID用完了会怎样

目录

一、有主键

二、无主键


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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
12 0
|
3天前
|
SQL 数据库
数据库Sql题目 : 不用id,每隔10行取一条数据
数据库Sql题目 : 不用id,每隔10行取一条数据
|
10月前
|
SQL 存储 Oracle
Oracle数据库中日期的操作、主键自增与分页查询
Oracle数据库中日期的操作、主键自增与分页查询
83 0
|
5月前
|
设计模式 算法 Java
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
47 1
|
8月前
|
关系型数据库 MySQL 数据库
MySQL数据库表Id过大
MySQL数据库表Id过大
70 0
|
9月前
|
算法 NoSQL 关系型数据库
数据库主键一定要自增吗?有哪些场景不建议自增?
数据库主键一定要自增吗?有哪些场景不建议自增?
291 0
|
9月前
|
关系型数据库 Java MySQL
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
|
9月前
|
存储 算法 NoSQL
常见分布式ID解决方案总结:数据库、算法、开源组件
分布式ID解决方案是用于在分布式系统中生成唯一标识符的方案。常见的分布式ID解决方案可总结为3点:数据库方案、算法方案、开源组件方案。
477 1
常见分布式ID解决方案总结:数据库、算法、开源组件
|
9月前
|
数据库 OceanBase
在OceanBase数据库中,当使用主键自增功能插入一条带有主键的数据
在OceanBase数据库中,当使用主键自增功能插入一条带有主键的数据
1182 1
|
10月前
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
189 0