UPDATE¶
Met à jour les lignes spécifiées dans la table cible avec de nouvelles valeurs.
Syntaxe¶
UPDATE <target_table>
SET <col_name> = <value> [ , <col_name> = <value> , ... ]
[ FROM <additional_tables> ]
[ WHERE <condition> ]
Paramètres requis¶
target_table
Spécifie la table à mettre à jour.
col_name
Spécifie le nom d’une colonne dans
target_table
. Ne pas inclure le nom de la table. Par exemple,UPDATE t1 SET t1.col = 1
n’est pas valide.value
Spécifie la nouvelle valeur à définir dans
col_name
.
Paramètres facultatifs¶
FROM additional_tables
Spécifie une ou plusieurs tables à utiliser pour sélectionner les lignes à mettre à jour ou pour définir de nouvelles valeurs. Notez que la répétition de la table cible entraîne une jointure réflexive.
WHERE condition
Expression qui spécifie les lignes de la table cible à mettre à jour.
Par défaut : aucune valeur (toutes les lignes de la table cible sont mises à jour)
Notes sur l’utilisation¶
Lorsqu’une clause FROM contient un JOIN entre des tables (par exemple,
t1
ett2
), une ligne cible danst1
peut être jointe (c’est-à-dire correspondre) à plus d’une ligne de la tablet2
. Dans ce cas, la ligne cible est appelée une ligne multi-jointe. Lors de la mise à jour d’une ligne multi-jointe, le paramètre de session ERROR_ON_NONDETERMINISTIC_UPDATE contrôle le résultat de la mise à jour :Si
FALSE
(valeur par défaut), aucune erreur n’est retournée et l’une des lignes jointes est utilisée pour mettre à jour la ligne cible ; cependant, la ligne jointe sélectionnée est non déterministe.IF
TRUE
, une erreur est retournée, y compris un exemple des valeurs d’une ligne cible qui joint plusieurs lignes.
Pour régler le paramètre :
ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;
Exemples¶
Effectuer une mise à jour standard à l’aide de deux tables :
UPDATE t1 SET number_column = t1.number_column + t2.number_column, t1.text_column = 'ASDF' FROM t2 WHERE t1.key_column = t2.t1_key and t1.number_column < 10;
Mettre à jour les tables avec une jointure qui produit des résultats non déterministes :
select * from target; +---+----+ | K | V | |---+----| | 0 | 10 | +---+----+ Select * from src; +---+----+ | K | V | |---+----| | 0 | 11 | | 0 | 12 | | 0 | 13 | +---+----+ -- Following statement joins all three rows in src against the single row in target UPDATE target SET v = src.v FROM src WHERE target.k = src.k; +------------------------+-------------------------------------+ | number of rows updated | number of multi-joined rows updated | |------------------------+-------------------------------------| | 1 | 1 | +------------------------+-------------------------------------+
Avec ERROR_ON_NONDETERMINISTIC_UPDATE = FALSE, l’instruction met à jour aléatoirement la ligne unique dans
target
en utilisant des valeurs d’une des lignes suivantes danssrc
:
(0, 11)
,(0, 12)
,(0,13)
Avec ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE, une erreur est renvoyée signalant une ligne DML dupliquée
[0, 10]
.
Pour éviter ce comportement et cette erreur non déterministes, utilisez une jointure 1 pour 1 :
UPDATE target SET v = b.v FROM (SELECT k, MIN(v) v FROM src GROUP BY k) b WHERE target.k = b.k;Cette instruction aboutit à la ligne unique dans
target
mise à jour dans(0, 11)
(valeurs de la ligne avec la valeur minimale pourv
danssrc
) et ne donnera jamais lieu à une erreur.