- Catégories :
Commandes DML - Général
UPDATE¶
Met à jour les lignes spécifiées dans la table cible avec de nouvelles valeurs.
Dans ce chapitre :
Syntaxe¶
UPDATE <target_table>
SET <col_name> = <value> [ , <col_name> = <value> , ... ]
[ FROM <additional_tables> ]
[ WHERE <condition> ]
Paramètres requis¶
table_cible
Spécifie la table à mettre à jour.
nom_colonne
Spécifie le nom d’une colonne dans
table_cible
. Ne pas inclure le nom de la table. Par exemple,UPDATE t1 SET t1.col = 1
n’est pas valide.valeur
Spécifie la nouvelle valeur à définir dans
nom_col
.
Paramètres facultatifs¶
FROM tables_supplémentaires
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¶
Lors de la mise à jour de lignes basées sur un JOIN avec une autre table (dans une clause
FROM
), une ligne cible peut se joindre à plusieurs lignes dans la relationFROM
. Lorsque cela se produit, 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.