我们想向数据库插入一条记录:
若数据表中存在以相同主键的记录,我们就更新该条记录。
否则就插入一条新的记录。
语法:
INSERT INTO tableA
(id,`value`) VALUES(3, 'SuperMan')
ON DUPLICATE KEY UPDATE
`value`='SuperMan';
注意 使用 INSERT ... ON DUPLICATE KEY UPDATE 可能产生death lock死锁问题
如果一个表定义有多个唯一键或者主键时,是不安全的,可能会引起死锁; insert ... on duplicate key 在执行时,innodb引擎会先判断插入的行是否产生重复key错误,如果存在,在对该现有的行加上S(共享锁)锁,如果返回该行数据给mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。如果有两个事务并发的执行同样的语句,那么就会产生death lock;
所以在使用时:
1、尽量不对存在多个唯一键的table使用该语句;
2、在有可能有并发事务执行的insert 的内容一样情况下不使用该语句;
2、在使用 INSERT ... ON DUPLICATE KEY UPDATE 不可以添加where 条件,错误演示:
INSERT INTO
t_customer_switch
(tenant_id,created_by_id,complex_switch)
VALUES (962443,962445,10)
ON DUPLICATE KEY UPDATE
updated_by_id=962445,
complex_switch=10
where
tenant_id = 962443;
如果非要加条件,可以使用if()函数
语法 IF(expr1,expr2,expr3)
if(a>b, c, d) 如果a > b 为true,返回 c ,否则返回 d
INSERT INTO tbl (columnA,columnB,columnC)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE
columnA=IF(columnB>0,1,columnA)