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处报错(除非重复插入)。

相关推荐
Small-Young20 分钟前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·spring boot·mysql·postgresql·乐观锁·并发控制
浮生若城22 分钟前
MySQL 数据库基础
数据库·mysql
香蕉大香蕉(06敬畏市场)35 分钟前
MySQL 单点详解(09)
java·数据库·mysql·面试·八股·大厂实习
瀚高PG实验室42 分钟前
瀚高数据库运行日志(错误日志)查看与分析方法
数据库·postgresql·瀚高数据库
snow@li43 分钟前
PostgreSQL:PostgreSQL(PG)全景深度梳理
数据库·postgresql
java_nnnn1 小时前
Spring IoC & DI 从入门到理解:控制反转、依赖注入与 Bean 管理详解
数据库·sql·spring
瀚高PG实验室2 小时前
HGHAC集群版本升级
数据库·postgresql·瀚高数据库
品牌常新2 小时前
室外巡检机器人推荐:园区与厂区怎么选
数据库·人工智能·机器人
snow@li2 小时前
redis:RedisDesktopManager(RDM/RESP.app)Redis 数据可视化全景深度梳理
数据库·redis·缓存
lqbzlll2 小时前
MySQL 慢查询日志开了但看不懂?从 slow_query_log 到 EXPLAIN ANALYZE 一步步定位
数据库·mysql·adb