18人参与 • 2026-04-29 • Mysql
mysql中可以设置auto_increment,作用是新增数据时不需要手动添加主键,输入null或未指定值时就会把auto_increment的值赋给自增主键。
一般来说,自增主键都是连续的,但是,有四个场景自增主键不是连续的!(使用的是innodb引擎)

innodb引擎有两个属性:auto_increment_offset(初始值)和auto_increment_increment(步长),一般默认为1,即初始值1,每次自增1,所以子增值就是1,2,3,4,5...这就是连续的.
如果设置这两个属性,自增值就会从初始值开始,每次加一次步长得到下一个数,比如设置初始值为3,步长为2,那自增值就是3,5,7,9...这就不是连续的了.
插入数据时,如果有设置唯一的字段重复了,那么就会报错,插入失败,但此时系统的自增值还是会增加一次,这是由于insert语句的执行流程导致的:
这个流程说明自增是在执行插入数据之前,所以哪怕语句失败了,自增值还是会自增,这时候再插入数据就会变成(3,2,1)了
mysql里有个rollback,它是tcl语句,叫事务控制语句,比如commit和rollback,前者是提交,后者是回滚,作用是撤销当前事务中已经进行的所有修改,使数据库返回到事务开始之前的状态!
当我们执行了插入操作后,自增值会增加,此时我们回滚,数据会回到插入之前的数据,但自增值不会跟着回到之前的自增值,这么设计的原因是为了提高性能.
因为如果此时有多个并行执行的事务(并行执行时会加锁),而回滚也会回滚自增值的话,就可能会导致主键重复冲突.为了解决这种冲突,要么就是判断赋值自增值时表里是否已经有此自增值,要么把锁的范围扩大到一个事务执行完并提交,无论是哪种方法,都会影响性能,所以才会设计自增值不会回滚。
对于批量插入的数据,mysql有一个批量申请自增的策略:
以此类推,同一个语句申请自增时,每次申请的个数都是上一次的两倍
(这里说的批量插入不是insert into table values(),这类语句是可以精准计算出需要多少自增值的,不知道需要多少自增值的语句是insert...select、replace … select 和 load data)
举个例子
有5个数据需要插入,(1,1),(2,2),(3,3),(4,4),(5,5)
此时自增值就变成了8,下次插入数据时就会把8赋值给主键!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论