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

相关推荐
流星白龙1 小时前
【MySQL高阶】26.事务(1)
数据库·mysql
三十..2 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
这个DBA有点耶2 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构
用户3074596982072 小时前
EXPLAIN 执行计划 完全精通指南
mysql
努力努力再努力wz2 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
JdSnE27zv3 小时前
Qt 操作SQLite数据库
数据库·qt·sqlite
tedcloud1233 小时前
HyperFrames部署教程:用HTML生成MP4视频
前端·数据库·人工智能·html·音视频
布朗克1683 小时前
25 IO流高级操作——序列化、NIO与Files工具类
java·数据库·io·nio
阿演3 小时前
DataDjinn 新版本更新:新增 Oracle 支持,查询窗口、表预览和连接树继续打磨
数据库·oracle·ai编程·数据库连接工具
lixora3 小时前
Oracle 11g Active Data Guard Go 自动化部署工具 v1.0
数据库·oracle