MySQL自增主键为何不连续

发布时间:2024年01月21日

自增值的存储原理

  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不连续
  • 回滚也会产生类似的现象
文章来源:https://blog.csdn.net/ChangerJJLee/article/details/135722862
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。