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. 注意事项
-
InnoDB 和 MyISAM 行为相同
-
即使删除记录,自增值也不会回退
-
可以手动修改自增值:
ALTER TABLE test_table AUTO_INCREMENT = 100; -
并发插入时,自增是线程安全的
7. 最佳实践建议
-- 如果想让自增从特定值开始
ALTER TABLE your_table AUTO_INCREMENT = 新值;
-- 如果发生"空洞"(跳号),通常是正常现象
-- 原因:事务回滚、记录删除、手动插入大值等
总结:手动插入id=15后,后续自动生成会从16开始,不会从5开始,也不会在15处报错(除非重复插入)。