当前位置: 首页 > news >正文

关于数据库表id自增问题

数据库中自增 ID(AUTO_INCREMENT)的最大值取决于表中 id 字段的数据类型。以下是对常见数据库(如 MySQL、PostgreSQL)和不同数据类型的最大值分析,结合你的上下文(XX表,id 字段为 INT 类型)。

1. MySQL

在 MySQL 中,自增 ID 的最大值由 id 字段的数据类型决定:

  • TINYINT
    • 有符号:-128 到 127
    • 无符号(UNSIGNED):0 到 255
  • SMALLINT
    • 有符号:-32,768 到 32,767
    • 无符号:0 到 65,535
  • MEDIUMINT
    • 有符号:-8,388,608 到 8,388,607
    • 无符号:0 到 16,777,215
  • INT / INTEGER
    • 有符号:-2,147,483,648 到 2,147,483,647(约 21 亿)
    • 无符号:0 到 4,294,967,295(约 42 亿)
  • BIGINT
    • 有符号:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    • 无符号:0 到 18,446,744,073,709,551,615

你的情况

  • 从之前的错误信息和代码来看,XX表的 id 字段定义为 INT(ALTER TABLE 表 MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT)。
  • 如果未指定 UNSIGNED,则默认是有符号 INT,最大值为 2,147,483,647(约 21 亿)。
  • 如果使用了 UNSIGNED INT,最大值为 4,294,967,295(约 42 亿)。

检查表结构: 运行以下 SQL 查看 id 字段的定义:

sql

收起自动换行

复制

SHOW CREATE TABLE ;

检查 id 是否包含 UNSIGNED 属性。如果没有,最大值为 21 亿;如果有,则为 42 亿。

自增 ID 耗尽后的行为
  • 当自增 ID 达到最大值(例如 INT 的 2,147,483,647),插入新记录会抛出错误:

    sql

    收起自动换行

    复制

    ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY'

  • MySQL 不会自动重用已删除的 ID(除非手动重置 AUTO_INCREMENT)。
扩展最大值

如果担心 ID 耗尽,可以将 id 字段改为 BIGINT:

sql

收起自动换行

复制

ALTER TABLE 表 MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT;

  • BIGINT 的最大值(约 9.2e18)几乎不可能耗尽,适合长期使用。

2. PostgreSQL

在 PostgreSQL 中,自增 ID 通常使用 SERIAL 类型:

  • SMALLSERIAL:1 到 32,767
  • SERIAL:1 到 2,147,483,647(等同于 MySQL 的 INT)
  • BIGSERIAL:1 到 9,223,372,036,854,775,807(等同于 MySQL 的 BIGINT)

你的情况

  • 如果使用 PostgreSQL 且 id 是 SERIAL,最大值为 21 亿。
  • 可改为 BIGSERIAL:

    sql

    收起自动换行

    复制

    ALTER TABLE 表 ALTER COLUMN id TYPE BIGSERIAL;

3. 其他数据库

  • SQL Server:INT(21 亿),BIGINT(9.2e18),类似 MySQL。
  • Oracle(12c 及以上):使用 IDENTITY 列,最大值取决于定义的 NUMBER 精度,默认支持极大值(通常 10^38)。

4. 结合你的需求(ID 重排)

你在之前的提问中提到希望删除记录后重排 ID。如果继续使用 AUTO_INCREMENT,ID 不会重用已删除的值,导致非连续 ID。以下是与最大值的相关建议:

  • 保持 AUTO_INCREMENT
    • 使用 INT UNSIGNED(42 亿)或 BIGINT(9.2e18)足以应对大多数场景。
    • 避免手动重排 ID,因为这会增加复杂性(例如外键冲突、并发问题)。
  • 手动管理 ID(如序列表方案):
    • 如果重用 ID,可以限制 ID 范围(例如重用 1 到 1000),但仍受数据类型上限约束。
    • 需确保代码逻辑(如 getReusableId)不会生成超过 INT 最大值(21 亿或 42 亿)的 ID。

5. 检查当前 ID 使用情况

查看 XX表当前的最大 ID 和自增计数器:

sql

收起自动换行

复制

SELECT MAX(id) AS max_id FROM ;

SELECT AUTO_INCREMENT

FROM information_schema.tables

WHERE table_name = '' AND table_schema = DATABASE();

  • 如果 max_id 接近 21 亿(或 42 亿),建议尽早迁移到 BIGINT。

6. 重置或调整自增计数器

如果你希望在删除记录后重置 ID(尽管不推荐),可以手动设置 AUTO_INCREMENT:

sql

收起自动换行

复制

ALTER TABLE 表 AUTO_INCREMENT = 1;

  • 警告:这不会重排现有记录的 ID,仅影响新插入记录的起点,可能导致主键冲突(如果现有记录的 ID 与新 ID 重叠)。

推荐方案

  • 继续使用 INT
    • 如果 XX 表的记录量远低于 21 亿(例如每天插入 10 万条记录,需 59 年耗尽 21 亿),无需担心上限。
    • 确保 id 定义为 INT NOT NULL AUTO_INCREMENT(或 UNSIGNED 增加到 42 亿)。
  • 升级到 BIGINT
    • 如果预计记录量很大(例如高频插入),改为 BIGINT:

      sql

      收起自动换行

      复制

      ALTER TABLE 表 MODIFY COLUMN id BIGINT NOT NULL AUTO_INCREMENT;

    • 注意:修改数据类型可能需要时间(尤其大数据量表),建议在低峰期操作并备份数据。
  • 避免重排 ID
    • 如前所述,重排 ID(例如重用已删除 ID)会增加复杂性,建议使用虚拟 ID(展示层编号)或接受非连续 ID。

结合你的代码

你的 insertByBo 方法使用 AUTO_INCREMENT(@TableId(type = IdType.AUTO)),因此 id 由数据库自动生成,最大值为 INT 的 21 亿(或 42 亿如果 UNSIGNED)。无需修改代码,只需确认表结构:

sql

收起自动换行

复制

SHOW CREATE TABLE ;

确保 id 定义为:

sql

收起自动换行

复制

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY

或:

sql

收起自动换行

复制

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY

总结

  • 最大值
    • 如果 id 是 INT,最大值为 2,147,483,647(有符号)或 4,294,967,295(无符号)。
    • 如果需要更大范围,改为 BIGINT(最大 9.2e18)。
  • 检查方法
    • 使用 SHOW CREATE TABLE 表; 确认 id 类型和 UNSIGNED 属性。
    • 检查当前最大 ID:SELECT MAX(id) FROM 表;
  • 建议
    • 保留 AUTO_INCREMENT,接受非连续 ID。
    • 如果记录量可能接近 21 亿,尽早迁移到 BIGINT。
    • 避免手动重排 ID,使用虚拟编号(如 UserXXXVo 的 virtualId)满足连续性需求。

如果需要进一步确认表结构、记录量或实现 ID 重排的代码,请提供更多细节(例如数据库类型、当前记录量、表结构),我可以提供更具体的指导!

http://www.dtcms.com/a/298183.html

相关文章:

  • Springboot垃圾分类管理的设计与实现
  • 人工智能概述
  • MyBatis-Plus极速开发指南
  • HAProxy 原理及配置
  • SpringBoot——使用@Scheduled定时器
  • cacti漏洞CVE-2022-46169复现
  • Android学习专题目录
  • 深入浅出设计模式——创建型模式之简单工厂模式
  • Spring Cache
  • Allegro软件光绘文件Artwork到底如何配置?
  • python+pandas是否能代替excel+vba?
  • C 标准库 <time.h> 函数详解
  • [ComfyUI] -入门2- 小白零基础搭建ComfyUI图像生成环境教程
  • 暑期算法训练.8
  • FastDFS如何提供HTTP访问电子影像文件
  • 海外短剧系统源码交付全解析:技术架构与全球化部署实战
  • 第十节 点阵屏模块
  • 案例分享|告别传统PDA+便携打印机模式,快速实现高效率贴标
  • 构建未来照护力量:虚拟仿真养老实训室的技能评估新体系
  • 常见主流网格孔洞修补算法(Mesh Hole Filling)汇总
  • 【Spring WebFlux】为什么 Spring 要拥抱响应式
  • 产业聚集+顶级配套 成都国际数字影像产业园打造企业战略增长极
  • DuoPlus云手机再上新:统一配置品牌型号、代理分组与便捷搜索功能全面提升!
  • 易求职 - 求职难题全方位解决方案
  • Android 图像编辑实战指南:从基础操作到进阶效果
  • 网络协议,DHCP 协议等。
  • 14-C语言:第14天笔记
  • C++ 笔记
  • 在Word和WPS文字中添加的拼音放到文字右边
  • 二分查找----6.寻找两个正序数组的中位数