温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

自动增长ID为何会不连续

发布时间:2026-09-28 01:19:22 来源:亿速云 阅读:99 作者:小樊 栏目:数据库

自动增长 ID(如 MySQL 的 AUTO_INCREMENT、SQL Server 的 IDENTITY、PostgreSQL 的 SERIAL/IDENTITY)出现不连续是非常常见的现象,通常由以下几类原因造成:


一、事务回滚

这是最常见原因。

  • 数据库在插入时会先分配自增 ID
  • 如果事务后续失败并回滚
  • 已分配的 ID 不会回收
BEGIN;
INSERT INTO user VALUES (NULL, 'A'); -- 分配 ID=10
ROLLBACK;

下次插入会变成 ID=11,10 就“消失”了。


二、插入失败(未提交事务)

包括:

  • 唯一键冲突
  • 字段约束错误
  • 超时、断连

即使没显式 ROLLBACK,ID 也已被消耗。


三、批量插入 / 并发插入

  • 多个事务并发插入
  • 各自分配 ID 后,部分事务失败
  • 最终保留的 ID 出现空洞

在高并发系统中尤其明显。


四、DELETE 删除数据

DELETE FROM user WHERE id = 100;
  • ID 不会复用
  • 下次插入仍从最大值 +1 开始

五、TRUNCATE 与重启行为(数据库相关)

不同数据库行为不同:

MySQL(InnoDB)

  • 重启后:
    • 若表中无数据 → 自增重置为 1
    • 若有数据 → 从当前最大 ID 继续

SQL Server

  • 重启后 IDENTITY 值通常保留

六、手动插入指定 ID

INSERT INTO user(id, name) VALUES (1000, 'X');

后续自增会从 1001 开始,前面产生断层。


七、主从复制 / 集群环境

  • 多节点分配不同 ID 段
  • 或复制延迟导致 ID 不连续

例如:

  • 主库用奇数
  • 从库用偶数

八、分库分表 / 分布式 ID

如使用:

  • UUID
  • Snowflake
  • 号段模式

本身就不保证连续,只保证唯一。


九、数据库优化或内部管理

某些数据库为了性能:

  • 预分配 ID
  • 批量缓存
  • 异常退出导致浪费

总结一句话

自增 ID 的设计目标是“唯一”,不是“连续”

如果你需要连续编号,常见替代方案:

  • 查询时 ROW_NUMBER()
  • 业务层生成序号
  • 使用单独计数表

如果你愿意,可以告诉我你用的是哪种数据库(MySQL / PostgreSQL / SQL Server 等),我可以给你更具体的解释或示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手