web-dev-qa-db-fra.com

Renvoyer les attributs de ligne mis à jour le UPDATE

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?

11
cppgnlearner

tilisez la clause RETURNING.

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 dans FROM, 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.

9
Erwin Brandstetter

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.

6
Gordon Linoff