私のクエリは次のとおりです:
UPDATE t1 SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
同じクエリでテーブルの更新された行の一部の属性を返すにはどうすればよいですか?
オプションの
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
は無効です。
RETURNING
句を使用できます。
UPDATE t1
SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
RETURNING *;
documentation はUPDATE
ステートメントの一部です。