use*_*531 7 sql postgresql sql-update sql-returning
我的查询如下:
UPDATE t1 SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
Run Code Online (Sandbox Code Playgroud)
如何在同一查询中返回表中更新行的某些属性?
可选
RETURNING子句会UPDATE根据实际更新的每一行来计算并返回值。FROM可以计算使用表的列和/或中提到的其他表的列的任何表达式。使用表列的新(更新后)值。
但是通常使用联接而不是相关的子查询会更聪明:
UPDATE t1
SET foreign_key = t2.id
FROM t2
WHERE t2.col = %s
AND t1.col = %s
RETURNING t1.*; -- or only selected columns
Run Code Online (Sandbox Code Playgroud)
对于您的原始查询,如果子查询未在中找到任何行t2,t1则无论如何都会进行更新并将t1.col其设置为NULL。通常,在这种情况下,您宁愿不更新行,这是我建议的查询所做的。
顺便说一句,SET子句中的目标列无法通过表限定(无论如何,仅更新一个表)。手册再次:
不要在目标列的规范中包含表的名称,例如,
UPDATE table_name SET table_name.col = 1无效。
您可以使用以下RETURNING条款:
UPDATE t1
SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
RETURNING *;
Run Code Online (Sandbox Code Playgroud)
该文档是的一部分UPDATE声明.