MySQL自增主键为何不连续

自增值的存储原理

  1. MyISAM引擎的自增值保存在数据文件中
  2. InnoDB引擎的自增值,保存在内存里
    • MySQL 8.0版本后,才有了“自增值持久化”的能力,实现了“如果发生重启,表的自增值可以恢复为MySQL重启前的值”,具体情况是,在MySQL 8.0版本,将自增值的变更记录在了redo log中,重启的时候依靠redo log恢复重启之前的值
    • MySQL 5.7及之前版本,自增值保存在内存里,没有持久化。所以,每次重启后打开表时,都会去找当前自增值的最大值max(id),然后将max(id)+1作为这个表当前的自增值。举例来说,如果一个表当前数据行里最大的id是10,AUTO_INCREMENT=11。这时候,我们删除id=10的行,AUTO_INCREMENT还是11。但如果马上重启实例,重启后这个表的AUTO_INCREMENT就会变成10。 也就是说,MySQL重启可能会修改一个表的AUTO_INCREMENT的值。

自增值修改机制

  • 如果插入数据时id字段指定为0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT值填到自增字段;
  • 如果插入数据时id字段指定了具体的值,就直接使用语句里指定的值。

自增值新增机制

  • 如果准备插入的值>=当前自增值,新的自增值 = “准备插入的值+1”;如若不然,自增值不变。

自增值的修改时机

  • 唯一键冲突是导致自增主键id不连续
  • 回滚也会产生类似的现象
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaysenLeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值