mysql主键递增,之前已经插入的id有1,2,3,4,5,手动插入的那条记录id=15,那后面让它自动生成主键,会是从15开始,还是从5开始

1. 关键结论

  • 自动生成 的主键会从 16 ​ 开始(15+1),不是从5开始

  • 手动插入 id=15不会报错(只要不重复)

  • 后续插入时,如果遇到已存在的id(如15)才会报主键冲突错误

2. 具体行为演示

复制代码
-- 1. 创建测试表
CREATE TABLE test_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);

-- 2. 插入1-5
INSERT INTO test_table (id, name) VALUES 
(1, '记录1'), (2, '记录2'), (3, '记录3'), 
(4, '记录4'), (5, '记录5');

-- 3. 手动插入id=15
INSERT INTO test_table (id, name) VALUES (15, '记录15');

-- 4. 查看当前自增值
SHOW TABLE STATUS LIKE 'test_table';
-- 此时 AUTO_INCREMENT 值会是 16

-- 5. 自动插入下一条
INSERT INTO test_table (name) VALUES ('自动记录');
-- 这条记录的id会是 16,不是6!

-- 6. 再尝试插入id=15会报错
INSERT INTO test_table (id, name) VALUES (15, '重复记录');
-- 错误: Duplicate entry '15' for key 'PRIMARY'

3. 底层机制

  • MySQL 会维护一个 AUTO_INCREMENT计数器

  • 每次插入后,计数器会更新为 MAX(id) + 1

  • 手动插入大值会"抬升"计数器

4. 查看当前自增值的几种方法

复制代码
-- 方法1:查看表状态
SHOW TABLE STATUS LIKE '表名';

-- 方法2:查询信息模式
SELECT AUTO_INCREMENT 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = '数据库名' 
AND TABLE_NAME = '表名';

-- 方法3:MAX函数(不准确,如果手动插入了更大的值)
SELECT MAX(id) FROM 表名;

5. 特殊情况说明

场景 结果
手动插入id=15 成功,计数器变为16
删除id=15的记录 计数器不会回退
插入id=20 计数器变为21
重启MySQL服务 计数器可能重新计算(取决于引擎)

6. 注意事项

  1. InnoDB 和 MyISAM 行为相同

  2. 即使删除记录,自增值也不会回退

  3. 可以手动修改自增值:

    复制代码
    ALTER TABLE test_table AUTO_INCREMENT = 100;
  4. 并发插入时,自增是线程安全的

7. 最佳实践建议

复制代码
-- 如果想让自增从特定值开始
ALTER TABLE your_table AUTO_INCREMENT = 新值;

-- 如果发生"空洞"(跳号),通常是正常现象
-- 原因:事务回滚、记录删除、手动插入大值等

总结:手动插入id=15后,后续自动生成会从16开始,不会从5开始,也不会在15处报错(除非重复插入)。

相关推荐
这个DBA有点耶9 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶10 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技11 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend12 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence15 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung2 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql