如何在PostgreSQL的ON CONFLICT子句中使用IF ELSE实现条件更新
实现方案
PostgreSQL的INSERT ON CONFLICT语法原生支持在UPDATE分支添加过滤条件,你需要的逻辑可以通过如下写法实现:
INSERT INTO 你的表名 (data, updated_mode, [其他需要插入的字段]) VALUES ('待插入的数据', 'automatic'::updated_mode, [其他对应字段值]) ON CONFLICT (冲突字段列表) DO UPDATE SET data = excluded.data -- 其他需要更新的字段可以继续往下加 WHERE 你的表名.updated_mode = 'automatic';
注意事项
- WHERE子句是对冲突发生时数据库中已存在的旧行进行判断,只有旧行的
updated_mode值为automatic时才会执行更新操作,不满足条件的冲突行不会被修改,完全符合你预期的逻辑。 - 如果是批量插入场景,该语法也完全适用,每一行冲突都会单独判断过滤条件,不需要额外调整写法。
- 若
updated_mode是枚举类型,建议在值后面加上对应枚举类型的强转,避免出现类型不匹配的报错,比如写成'automatic'::枚举类型名。
内容的提问来源于stack exchange,提问作者Ritik Harchani
相关产品推荐
相关产品推荐

