如何实现行存在则更新、不存在则插入,避免误触发自增?
用INSERT ... ON DUPLICATE KEY UPDATE实现"存在则更新,不存在则插入"
嘿,这个需求在MySQL里太常见了,刚好你已经把fruit设为唯一键,完美契合INSERT ... ON DUPLICATE KEY UPDATE的使用场景,我给你讲清楚怎么用:
核心原理
这个语法的关键在于唯一键/主键冲突触发更新:当你插入的行和表中已有的行在fruit(唯一键)上重复时,就会执行后面的UPDATE逻辑;如果没有冲突,就正常插入新行。
具体SQL示例
假设你的表名叫fruit_colors,直接用下面的语句就能实现需求:
INSERT INTO fruit_colors (fruit, color) VALUES ('apple', 'red'), -- apple已存在,会更新它的color为red ('orange', 'orange') -- orange不存在,会插入新行 ON DUPLICATE KEY UPDATE color = VALUES(color);
更直观的写法(MySQL 8.0.19+)
如果你的MySQL版本是8.0.19及以上,可以用EXCLUDED关键字,它代表原本要插入的那条记录,写法更易懂:
INSERT INTO fruit_colors (fruit, color) VALUES ('banana', 'dark_yellow') ON DUPLICATE KEY UPDATE color = EXCLUDED.color;
几个注意事项
- 必须保证
fruit字段有唯一约束(你已经设置为唯一键,这点没问题),否则这个语法只会重复插入,不会触发更新。 - 自增主键
id:执行更新时,id不会改变;只有插入新行时才会自动递增。 - 多字段更新:如果以后需要更新多个属性,只要在UPDATE后面用逗号分隔就行,比如:
INSERT INTO fruit_colors (fruit, color, price) VALUES ('apple', 'red', 5.99) ON DUPLICATE KEY UPDATE color = EXCLUDED.color, price = EXCLUDED.price;
执行效果示例
比如执行第一个SQL后,你的表数据会变成:
+----+--------+--------+
| id | fruit | color |
+----+--------+--------+
| 1 | apple | red |
| 2 | banana | yellow |
| 3 | orange | orange |
+----+--------+--------+
内容的提问来源于stack exchange,提问作者user1111929
相关产品推荐
相关产品推荐

