温馨提示×

温馨提示×

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

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

数据库自增主键为何跳号

发布时间:2026-09-07 10:38:55 来源:亿速云 阅读:119 作者:小樊 栏目:数据库

数据库自增主键(AUTO_INCREMENT / IDENTITY / SEQUENCE 等)出现“跳号”(不连续)是非常常见的现象,本质原因是:自增值的分配与最终是否成功写入不是强一致的。

下面按常见原因分类说明(以 MySQL 为主,其他数据库类似):


1. 事务回滚(最常见)

BEGIN;
INSERT INTO t(id, name) VALUES (NULL, 'a'); -- 分配 id=10
ROLLBACK;
  • 自增计数器 已经 +1
  • 但数据没写进去
  • 下次插入会从 11 开始

✅ 结论:回滚不会回收自增 ID


2. INSERT 失败(非回滚)

包括:

  • 唯一键冲突
  • 字段超长
  • 类型错误
  • 权限不足
INSERT INTO t VALUES (NULL, 'duplicate'); -- 失败,但 id 已分配

→ 同样会跳号


3. 批量插入只部分成功

INSERT INTO t VALUES (NULL),(NULL),(NULL);
-- 第 2 条失败
  • 已分配 3 个 ID
  • 只写入 2 条
  • 剩余 ID 被浪费

4. 多事务并发插入

两个事务同时:

  • 都申请自增 ID
  • 一个后提交,一个先提交
  • 或其中一个回滚

结果:

1, 2, 4, 5, 7...

✅ 并发下跳号是正常且必要的


5. 数据库重启(MySQL 8 之前尤其明显)

  • MySQL 5.7 及以前:
    • 自增最大值 不在磁盘持久化
    • 重启后可能重新计算
    • 或从 binlog / 表中恢复不一致
  • 可能表现:
    • 跳一大段
    • 或重复使用(极少)

✅ MySQL 8.0 已改进(持久化自增)


6. 显式插入自增列

INSERT INTO t(id) VALUES (100);

后续自增会从 101 开始


7. 使用 SEQUENCE(Oracle / PostgreSQL)

nextval
  • 即使没用
  • 或事务回滚
  • 也会跳号

8. 主从复制 / 分布式环境

  • 双主
  • 多写
  • 分库分表
  • 自增步长 > 1

例如:

A: 1,3,5,7
B: 2,4,6,8

9. 删除数据不会“补号”

DELETE FROM t WHERE id = 5;
  • 5 永远不会自动复用

总结一句话

自增主键保证“唯一”,不保证“连续”

是否需要解决?

  • ❌ 业务上:不需要连续
  • ✅ 正确做法:
    • 不要依赖 ID 连续性
    • 不要用 ID 判断数量 / 顺序
    • 连续编号请用业务字段或单独生成器

如果你说的是某个具体数据库(MySQL / PostgreSQL / Oracle)或某种跳号场景(如重启后跳 1000),我可以更精确地解释。

向AI问一下细节

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

AI
助
手