MySQL 5.7如何实现带条件判断的ON DUPLICATE KEY UPDATE功能?
结论
MySQL 5.7 原生支持在 ON DUPLICATE KEY UPDATE 语法中加入条件判断,你这个需求完全可以用单条 INSERT 语句实现,无需先查询比对数据。
前置操作
首先需要给 name 字段添加唯一索引,这样才能触发冲突检测逻辑:
ALTER TABLE t ADD UNIQUE KEY uk_name (name);
实现语句
直接使用 IF 函数做条件判断即可,VALUES(字段名) 指代本次待插入的对应字段值,不带前缀的字段名指代表中已存在的旧记录值:
INSERT INTO t (name, value, lastupdate) VALUES ('a', 20, '2021-01-01'), ('b', 40, '2021-01-01'), ('c', 60, '2021-04-01') ON DUPLICATE KEY UPDATE value = IF(VALUES(lastupdate) >= lastupdate, VALUES(value), value);
执行结果验证
执行后表内数据和你给出的预期结果完全一致:
| name | value | lastupdate |
|---|---|---|
| a | 20 | 2021-01-01 |
| b | 20 | 2021-02-01 |
| c | 60 | 2021-03-01 |
补充说明
如果后续需求调整为时间符合条件时同步更新 lastupdate 字段,只需要在 ON DUPLICATE KEY UPDATE 后追加对应逻辑即可:
ON DUPLICATE KEY UPDATE value = IF(VALUES(lastupdate) >= lastupdate, VALUES(value), value), lastupdate = IF(VALUES(lastupdate) >= lastupdate, VALUES(lastupdate), lastupdate)
内容的提问来源于stack exchange,提问作者Thallius
相关产品推荐
相关产品推荐

