数据库自增主键(AUTO_INCREMENT / IDENTITY / SEQUENCE 等)出现“跳号”(不连续)是非常常见的现象,本质原因是:自增值的分配与最终是否成功写入不是强一致的。
下面按常见原因分类说明(以 MySQL 为主,其他数据库类似):
BEGIN;
INSERT INTO t(id, name) VALUES (NULL, 'a'); -- 分配 id=10
ROLLBACK;
✅ 结论:回滚不会回收自增 ID
包括:
INSERT INTO t VALUES (NULL, 'duplicate'); -- 失败,但 id 已分配
→ 同样会跳号
INSERT INTO t VALUES (NULL),(NULL),(NULL);
-- 第 2 条失败
两个事务同时:
结果:
1, 2, 4, 5, 7...
✅ 并发下跳号是正常且必要的
✅ MySQL 8.0 已改进(持久化自增)
INSERT INTO t(id) VALUES (100);
后续自增会从 101 开始
nextval
例如:
A: 1,3,5,7
B: 2,4,6,8
DELETE FROM t WHERE id = 5;
自增主键保证“唯一”,不保证“连续”
如果你说的是某个具体数据库(MySQL / PostgreSQL / Oracle)或某种跳号场景(如重启后跳 1000),我可以更精确地解释。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。