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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 数据库自增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,并覆盖前面的数据。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
SQL 关系型数据库 数据处理
实时计算 Flink版产品使用问题之如何去除源数据库的ID
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
存储 小程序 数据库
【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏
【微信小程序-原生开发】实用教程08 - 开通微信云开发,操作云数据库新增数据(含修改数据权限),初始化云服务(含获取微信云环境 id),获取云数据,滚动公告栏
67 0
|
6月前
|
SQL 关系型数据库 MySQL
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中
40 0
|
11月前
|
设计模式 算法 Java
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
浩鲸科技:为什么要用雪花ID替代数据库自增ID?
102 1
|
6月前
|
SQL 数据库
数据库Sql题目 : 不用id,每隔10行取一条数据
数据库Sql题目 : 不用id,每隔10行取一条数据
|
存储 算法 NoSQL
常见分布式ID解决方案总结:数据库、算法、开源组件
分布式ID解决方案是用于在分布式系统中生成唯一标识符的方案。常见的分布式ID解决方案可总结为3点:数据库方案、算法方案、开源组件方案。
698 1
常见分布式ID解决方案总结:数据库、算法、开源组件
|
关系型数据库 Java MySQL
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
|
数据库 OceanBase
在OceanBase数据库中,当使用主键自增功能插入一条带有主键的数据
在OceanBase数据库中,当使用主键自增功能插入一条带有主键的数据
1662 1
|
关系型数据库 MySQL 数据库
MySQL数据库表Id过大
MySQL数据库表Id过大
140 0
|
算法 NoSQL 关系型数据库
数据库主键一定要自增吗?有哪些场景不建议自增?
数据库主键一定要自增吗?有哪些场景不建议自增?
442 0