MySQL_插入更新 ON DUPLICATE KEY UPDATE

本文介绍了一种MySQL中插入记录的方法,即当记录已存在时进行更新,否则插入新记录。并详细解释了INSERT...ON DUPLICATE KEY UPDATE语句的用法及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们想向数据库插入一条记录:

  若数据表中存在以相同主键的记录,我们就更新该条记录。

  否则就插入一条新的记录。

语法:

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值