在UPDATE上返回更新的行属性

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)

如何在同一查询中返回表中更新行的某些属性?

Erw*_*ter 8

使用RETURNING子句。

可选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)

对于您的原始查询,如果子查询未在中找到任何行t2t1则无论如何都会进行更新并将t1.col其设置为NULL。通常,在这种情况下,您宁愿更新行,这是我建议的查询所做的。

顺便说一句,SET子句中的目标列无法通过表限定(无论如何,仅更新一个表)。手册再次:

不要在目标列的规范中包含表的名称,例如,UPDATE table_name SET table_name.col = 1无效。


Gor*_*off 5

您可以使用以下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声明.