PostgreSQL:实现插入或更新记录并始终返回主键的方法
解决方案
可以通过合并更新与插入操作返回的结果集,实现始终返回主键的需求,重写后的查询如下:
WITH _a AS ( UPDATE mytable1 SET name = expr1, last_name = expr2 WHERE empId = expr3 RETURNING empId ), _b AS ( INSERT INTO mytable1 (empId, name, last_name) SELECT expr3, expr1, expr2 WHERE NOT EXISTS (SELECT 1 FROM _a) RETURNING empId ) SELECT empId FROM _a UNION ALL SELECT empId FROM _b;
关键修改说明:
- 修正了INSERT语句的
SELECT写法:原语句的SELECT(expr3, expr1, expr2)会生成单行复合值,易导致列数不匹配,改为SELECT expr3, expr1, expr2直接提供对应列的取值。 - 新增
UNION ALL合并结果集:更新操作时_a会返回主键,插入操作时_b会返回主键,合并两个结果集后,无论哪种操作都会输出对应的主键。
内容的提问来源于stack exchange,提问作者Inessa
相关产品推荐
相关产品推荐

