insert into xxx on duplicate key update xxx=xxx语句,解决插入数据时产生的重复主键问题,前提是设置了正确的unique key。
相当于完成的操作:
if not exists (select 。。。。。。)
insert into 。。。。。。
else
update 。。。。。。
说明:
1、on duplicate key update 支持在INSERT语句中有存在主键或者唯一索引的列,相应的数据在表中存在会执行更新操作,否则执行插入操作。
当然不论是否更新主键或唯一索引,这两种字段在表中数据都不允许重复。
2、on duplicate key update在数据量不大,并且duplicate key不多的情况下,性能良好,但若是存在较多的duplicate key时,性能会大打折扣。
解决方案要根据实际场景来定:
a、可以先update 然后再insert ignore操作,拆解成多步
b、可以使用类似insert ...... select ....where not exist 等方式,拆解成多步
3、在表中存在多个唯一索引或存在并发事务的情况下,避免使用此方式,避免数据库产生死锁death lock