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相关信息时)。