【问题标题】:Why are there auto increment gaps in MySQL when violating a unique key constraint, but not a primary key constraint?为什么在违反唯一键约束而不是主键约束时 MySQL 中存在自动增量间隙?
【发布时间】:2018-06-12 14:04:54
【问题描述】:

我了解在 MySQL 中使用 INSERT ... ON DUPLICATE KEY UPDATE 时,插入失败时会出现自动增量间隙。但是 - 我注意到只有在违反唯一键约束时才会出现差距。如果主键约束失败,则不会出现自增间隙。

两者的区别是什么原因?

谢谢!

【问题讨论】:

  • 这就是它的工作方式。
  • 可能是因为主键必须是自增列,所以特殊处理。
  • 自增字段是主键吗?还是它是主键的一部分,而您将其值指定为插入的一部分?
  • 自增字段为主键
  • @KyleChadha Shadow 的回答很明确,primary key constraint fails 表示用户定义了 PK,因此 mysql 不会为 PK(自增列)生成新值,但 unique key constraint is violated 会。

标签: mysql auto-increment on-duplicate-key


【解决方案1】:

如果自动递增字段是主键,那么只有在插入语句中将自动递增字段的值显式设置为该字段中已经存在的值时,主键中的重复才会发生(为什么要这样做是超出我的范围)。

正如using auto increment 上的 mysql 文档所说:

当您将任何其他值插入到 AUTO_INCREMENT 列中时,该列将设置为该值并重置序列,以便下一个自动生成的值从最大列值开始依次出现。

关键是,在这种情况下,mysql 不会尝试为自动增量列生成值,而是会使用插入中指定的值。而且,序列也被重置为字段中的最大值,因此下一次插入不会有任何间隙。

但是,如果在尝试插入时另一个唯一索引约束失败,则 mysql 已经为自增字段生成了值,因此在自增序列中创建了一个间隙。

【讨论】:

    【解决方案2】:

    仅当您未为 AI 列指定值时,才会生成新的自动增量值。

    mysql> create table MyTable (id int auto_increment primary key, x int, unique key(x));
    mysql> insert into MyTable values (1, 100), (2, 200);
    
    mysql> insert into MyTable (id) values (2);
    ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
    

    在此示例中,只有在我的 INSERT 中指定了一个值时,我才能创建一个重复的 id 值。在这种情况下,它会跳过分配新的 AI 值。

    如果我创建了一个与我的辅助唯一列冲突的重复值,我可能为 id 提供特定值。这会导致 AI 生成一个新值,但最终 INSERT 由于辅助列中的重复而失败,并且生成的 AI 值丢失。

    mysql> insert into MyTable (x) values (200);
    ERROR 1062 (23000): Duplicate entry '200' for key 'x'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2019-05-03
      • 1970-01-01
      • 2022-01-06
      • 2012-07-15
      相关资源
      最近更新 更多