PostgreSQL13 INSERT ON CONFLICT语法报错,需实现存在返回id否则插入返回id
问题排查与解决方案
错误原因
- 第一个语法错误:
RETURNING子句的位置错误,INSERT语句的ON CONFLICT逻辑必须放在VALUES子句之后、RETURNING子句之前,且整个语句仅需要最后写一次RETURNING即可,不需要分两处写。 - 第二个语法错误:
ON CONFLICT ... DO UPDATE后不需要重复指定表名,当前操作默认针对插入的目标表。
正确实现语句
INSERT INTO project_test(project_id) VALUES(50) ON CONFLICT (project_id) DO UPDATE SET id = project_test.id -- 无实际修改的空更新,仅触发返回逻辑 RETURNING id;
可选优化
如果不需要触发任何更新相关的副作用(比如行级更新触发器),也可以用更轻量的写法:
WITH inserted AS ( INSERT INTO project_test(project_id) VALUES (50) ON CONFLICT (project_id) DO NOTHING RETURNING id ) SELECT id FROM inserted UNION ALL SELECT id FROM project_test WHERE project_id = 50 LIMIT 1;
内容的提问来源于stack exchange,提问作者turtle
相关产品推荐
相关产品推荐

