✅什么情况会导致自增主键不连续?

典型回答

一般来说,MySQL的自增主键,都是可以保证连续自增的,因为底层采用了AUTO-INC锁进行并发控制,但是还是有些情况会导致他出现不自增的情况。

主要有以下这几种情况:

  1. 事务回滚:如果一个事务包含了对自增主键表的插入操作,但事务最终失败并回滚,已经分配的自增值不会被重用。这会导致自增主键序列中出现跳跃。
  2. 删除操作:这个好理解,从表中删除行会导致自增主键序列出现间隔。因为当行被删除后,其对应的自增主键值不会被重用。
  3. 手动指定自增值:如果在插入数据时手动指定了自增列的值,MySQL将使用该值而非自动生成的下一个自增值。如果指定的值大于当前的自增值,MySQL将更新自增计数器为该值,导致后续自动生成的自增值跳跃。
  4. 服务器重启:对于某些数据库引擎(尤其是早期版本的MySQL和InnoDB引擎),自增计数器可能不会持久化到磁盘。如果数据库服务器重启,自增计数器可能会重置为当前最大自增值加一,但未提交的事务占用的自增值会丢失,导致不连续。
  5. 更改自增值设置:通过修改表的自增起始值或者直接修改自增计数器的值,也可以导致自增主键不连续。
  6. 数据导入:在导入数据时,如果导入的数据中包含自增主键列,并且导入数据的主键值与现有数据不连续,也会导致自增主键不连续。
  7. 用了**INSERT INTOON DUPLICATE KEY UPDATE**,MySQL 在尝试插入新记录时,会先分配一个新的自增主键值,无论后续是插入成功还是执行更新操作,这个主键值都已经被分配并且会增加。当插入失败时会导致主键加1,但实际没记录。

✅SQL语句如何实现insertOrUpdate的功能?

原文: https://www.yuque.com/hollis666/xkm7k3/vtfa41wvszopeaz8