温馨提示×

温馨提示×

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

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

为何自增ID不连续

发布时间:2026-10-18 17:23:29 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

自增 ID(如 MySQL 的 AUTO_INCREMENT)看起来应该是连续递增的,但在实际运行中经常会出现不连续的情况。主要原因如下:


1. 事务回滚

这是最常见原因。

BEGIN;
INSERT INTO user VALUES (NULL, 'Tom');  -- 分配 ID = 10
ROLLBACK;
  • ID = 10 已经被分配
  • 但插入失败,记录不存在
  • 下一次插入会直接用 11

✅ 结果:ID 不连续(10 被“吃掉”)


2. 插入失败(非回滚)

例如:

  • 唯一键冲突
  • 字段约束错误
  • 超过最大长度
INSERT INTO user(id, name) VALUES (10, 'Tom'); -- 冲突

自增计数器已经前进,但数据没写进去。


3. 手动指定 ID

INSERT INTO user(id, name) VALUES (100, 'Admin');

之后自增会从 101 开始,前面的 ID 被“跳过”。


4. 删除数据

DELETE FROM user WHERE id = 50;
  • 数据被删
  • 但自增计数器不会回退

5. 多事务并发插入

在高并发场景:

  • 事务 A 拿到 ID = 20
  • 事务 B 拿到 ID = 21
  • A 回滚,B 提交

结果:20 缺失


6. 数据库重启(MySQL 8 之前)

在 MySQL 5.7 及以前:

  • AUTO_INCREMENT 值不持久化
  • 重启后可能重新计算
  • 可能导致跳号

✅ MySQL 8.0 已修复此问题


7. 主从复制 / 批量插入

  • 批量插入会一次性分配多个 ID
  • 失败或只使用部分
  • 从库可能看到不同序列

8. 分库分表 / 雪花算法

如果你不是用数据库自增,而是:

  • 雪花 ID
  • UUID
  • 分段自增

那本身就不是连续设计目标。


总结一句话

自增 ID 保证“唯一 + 递增”,但不保证“连续”

如果你需要:

  • 连续编号(如订单号)
  • 不跳号

那就不能依赖自增 ID,需要额外方案(计数器表、业务号生成器等)。

如果你说的是某个具体数据库(MySQL / PostgreSQL / Oracle),我可以给你更针对性的解释。

向AI问一下细节

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

AI
助
手