Ma requête est la suivante:
UPDATE t1 SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
Comment renvoyer certains attributs de la ligne mise à jour dans le tableau dans la même requête?
La clause facultative
RETURNING
permet àUPDATE
de calculer et de renvoyer des valeurs en fonction de chaque ligne réellement mise à jour. Toute expression utilisant les colonnes de la table et/ou les colonnes d'autres tables mentionnées dansFROM
, peut être calculée. Les nouvelles valeurs (post-mise à jour) des colonnes du tableau sont utilisées.
Mais généralement, il est plus intelligent d'utiliser une jointure au lieu d'une sous-requête corrélée:
UPDATE t1
SET foreign_key = t2.id
FROM t2
WHERE t2.col = %s
AND t1.col = %s
RETURNING t1.*; -- or only selected columns
Avec votre requête d'origine, si la sous-requête ne trouve aucune ligne dans t2
, t1
est quand même mis à jour et t1.col
est défini sur NULL. En règle générale, vous préférez ne pas mettre à jour la ligne dans ce cas, ce que fait ma requête suggérée à la place.
BTW, les colonnes cibles dans la clause SET
ne peuvent pas être qualifiées de table (seule une table est quand même mise à jour). Le manuel une fois de plus:
N'incluez pas le nom de la table dans la spécification d'une colonne cible - par exemple,
UPDATE table_name SET table_name.col = 1
est invalide.
Vous pouvez utiliser la clause RETURNING
:
UPDATE t1
SET t1.foreign_key = (SELECT id FROM t2 WHERE t2.col = %s )
WHERE t1.col = %s
RETURNING *;
documentation fait partie de l'instruction UPDATE
.