为什么mysql中违反了唯一键约束而不是主键约束时会出现自动增量间隙?

tp5buhyn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(357)

我明白当使用 INSERT ... ON DUPLICATE KEY UPDATE 在mysql中,插入失败时会自动增加间隔。但是--我注意到,只有在违反了unique key约束时,才会出现间隙。如果主键约束失败,则不会自动增加间距。
这两者有区别的原因是什么?
谢谢!

fd3cxomn

fd3cxomn1#

如果auto-increment字段是主键,那么只有在insert语句中将auto-increment字段的值显式设置为该字段中已有的值时,主键中才能发生重复(我无法理解为什么要这样做)。
正如mysql关于使用自动增量的文档所说:
在自动递增列中插入任何其他值时,该列将被设置为该值,并且序列将被重置,以便下一个自动生成的值从最大的列值开始依次出现。
关键是,在本例中,mysql不尝试为auto increment列生成值,而是使用insert中指定的值。此外,序列也会重置为字段中的最大值,因此下一次插入不会有任何间隙。
但是,如果在尝试插入时另一个唯一索引约束失败,那么mysql已经为auto increment字段生成了值,因此在auto increment序列中创建了一个间隙。

carvr3hs

carvr3hs2#

仅当未为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生成一个新值,但最终由于第二个列中的重复而导致插入失败,并且生成的ai值将丢失。

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

相关问题