web-dev-qa-db-ja.com

更新時に更新された行属性を返す

私のクエリは次のとおりです:

UPDATE t1 SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s ) 
WHERE t1.col = %s

同じクエリでテーブルの更新された行の一部の属性を返すにはどうすればよいですか?

11
cppgnlearner

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

元のクエリでは、サブクエリがt2に行を見つけられない場合、t1がとにかく更新され、t1.colがNULLに設定されます。通常、この場合、行を更新するのではなくしないが推奨されます。

ところで、SET句のターゲット列はテーブル修飾できません(oneテーブルのみがとにかく更新されます)。もう一度マニュアル:

ターゲット列の指定にテーブルの名前を含めないでください。たとえば、UPDATE table_name SET table_name.col = 1は無効です。

9

RETURNING句を使用できます。

UPDATE t1
    SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s ) 
    WHERE t1.col = %s
    RETURNING *;

documentationUPDATEステートメントの一部です。

6
Gordon Linoff