我明白当使用 INSERT ... ON DUPLICATE KEY UPDATE 在mysql中,插入失败时会自动增加间隔。但是--我注意到,只有在违反了unique key约束时,才会出现间隙。如果主键约束失败,则不会自动增加间距。这两者有区别的原因是什么?谢谢!
INSERT ... ON DUPLICATE KEY UPDATE
fd3cxomn1#
如果auto-increment字段是主键,那么只有在insert语句中将auto-increment字段的值显式设置为该字段中已有的值时,主键中才能发生重复(我无法理解为什么要这样做)。正如mysql关于使用自动增量的文档所说:在自动递增列中插入任何其他值时,该列将被设置为该值,并且序列将被重置,以便下一个自动生成的值从最大的列值开始依次出现。关键是,在本例中,mysql不尝试为auto increment列生成值,而是使用insert中指定的值。此外,序列也会重置为字段中的最大值,因此下一次插入不会有任何间隙。但是,如果在尝试插入时另一个唯一索引约束失败,那么mysql已经为auto increment字段生成了值,因此在auto increment序列中创建了一个间隙。
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'
2条答案
按热度按时间fd3cxomn1#
如果auto-increment字段是主键,那么只有在insert语句中将auto-increment字段的值显式设置为该字段中已有的值时,主键中才能发生重复(我无法理解为什么要这样做)。
正如mysql关于使用自动增量的文档所说:
在自动递增列中插入任何其他值时,该列将被设置为该值,并且序列将被重置,以便下一个自动生成的值从最大的列值开始依次出现。
关键是,在本例中,mysql不尝试为auto increment列生成值,而是使用insert中指定的值。此外,序列也会重置为字段中的最大值,因此下一次插入不会有任何间隙。
但是,如果在尝试插入时另一个唯一索引约束失败,那么mysql已经为auto increment字段生成了值,因此在auto increment序列中创建了一个间隙。
carvr3hs2#
仅当未为ai列指定值时,才会生成新的自动增量值。
在本例中,只有在insert中指定值时,才能创建重复的id值。在这种情况下,它跳过分配新的ai值。
然而,如果我创建的重复值与我的第二个唯一列相冲突,我可能不会为id提供特定的值。这将导致ai生成一个新值,但最终由于第二个列中的重复而导致插入失败,并且生成的ai值将丢失。