mysql ON DUPLICATE KEY UPDATE 使用浅析

对于有些时候我们可能有这样的需求,有一条数据,我们想在 insert 已经存在的记录时,执行 update 操作。
类似:

INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;

如何理解这条语句呢?前面的部分,就是一个简单的插入语句,后面的部分
ON DUPLICATE KEY UPDATE field1=value1,field2=value2...
这一段是一个更新的操作,后面指定了更新的字段,也就是说判断出表中没有 insert 的这条数据,执行的前半部分,插入指定字段得值,在判断出表中有 insert 的这条数据,则执行的的更新操作,更新后半部分指定的字段的值。

判断依据

我们是如何判断出这条数据是存在的,又需要更新哪些字段呢?
如果插入的记录导致 unique 索引重复,那么就会认为该条记录存在,则执行 update 语句而不是 insert 语句,反之,则执行 insert 语句而不是更新语句
比如在创建表的时候设置的唯一索引为字段 a1,a2,a3 那么当 a1,a2,a3 三个字段完全重复时候,此时就要执行更新语句。满足一部分唯一索引是不会触发更新操作的,此时会执行插入操作。
至于要更新哪些字段,就要看实际的需求了。

个人使用

当前,在遇到这种情况时,效率肯定是 ON DUPLICATE KEY UPDATE 高,但是很多时候由于表结构还有服务器权限等其他问题,我们并没有去修改表的权限或是对表进行其他操作的权限,那么这时我通常用一个比较脏的方法来解决这类问题,当然是不得已而为之,其实并不推荐这么用:

INSERT INTO a_t (`school`,`email`,`number`)
SELECT * FROM (SELECT '财大1', '111@11.com', 224) AS tmp
WHERE NOT EXISTS (
    SELECT id FROM a_t WHERE `school` = '财大1' and `email`='111@11.com' and `number`=224
) ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值