mysql之replace into导致的id自增问题

replace into是mysql特有的语法。

如果数据存在(id重复或其他唯一约束冲突),则会执行更新操作。

但是很显然,这个更新,实际是先删除,再更新,从而导致更新后的数据id不一致。

在主从数据库时,则更容易产生bug,因为在binlog中,记录的是update,导致从库数据的id不变,而主库的id实际已经改变。

insert into … on duplication key update 语法:

insert into…on duplicate key update…

需要注意的是,如果有多个 duplication key,则不可使用。因为只要有一个 duplication key 就会触发。

另外,它默认也会导致 id 自增(和前面的有些不同,它只是单纯的浪费id自增值,容易导致超过最大自增)

简单点来看,不使用特有语法:

  • 先 select 出记录id,如果存在 id,则说明记录存在,此时直接根据 id 进行 update,否则直接 insert。
  • 直接 insert ignore into … ,如果不成功,则 update。
  • 直接 update (使用了 where 的情况),如果update不成功,则 insert 。

在插入频繁时,使用 insert ignore into性能更好。

在修改频繁时,直接 update 性能更好。

如果是 select ,然后判断并选择 insert 或 update,性能最低,最简单(在一些特殊情况下,就非选不可了,当你必须select相关信息时)。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注