INSERT ON DUPLICATE KEY UPDATE如何实现重复键时值累加
需求实现说明
这个需求完全可以实现,首先要满足前置条件:必须给name字段设置主键或者唯一约束,否则数据库无法识别重复记录,冲突更新逻辑不会触发。如果还没加约束,先执行对应语句创建:
-- 把table替换成你的实际表名 ALTER TABLE `table` ADD UNIQUE KEY `uk_name` (`name`);
不同数据库的upsert语法略有区别,对应正确写法如下:
- MySQL / MariaDB
使用ON DUPLICATE KEY UPDATE语法实现,VALUES(val)会取到本次尝试插入的新y值:
INSERT INTO `table` (name, val) VALUES (x, y) -- 替换为你实际要插入的x、y值 ON DUPLICATE KEY UPDATE val = val + VALUES(val);
按照你给出的现有数据举例:如果执行INSERT INTO table (name, val) VALUES ('John',2),因为John已存在,最终John对应的val会更新为1+2=3;如果插入不存在的name比如('Bob',4),会正常插入新记录,val值为4。
- PostgreSQL
使用ON CONFLICT语法实现,EXCLUDED.val指代本次插入的新y值:
INSERT INTO "table" (name, val) VALUES (x, y) ON CONFLICT (name) DO UPDATE SET val = "table".val + EXCLUDED.val;
- SQLite
语法和PostgreSQL基本一致,关键字大小写不做强制要求:
INSERT INTO `table` (name, val) VALUES (x, y) ON CONFLICT(name) DO UPDATE SET val = val + excluded.val;
踩坑提醒:不要把更新逻辑写成
val = y,这样会直接覆盖原有值,无法实现累加效果;也不要写错新值的引用关键字,会导致SQL执行报错。
内容的提问来源于stack exchange,提问作者maxy
相关产品推荐
相关产品推荐

