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_tableSpécifie la table à mettre à jour.
col_nameSpécifie le nom d’une colonne dans
target_table. Ne pas inclure le nom de la table. Par exemple,UPDATE t1 SET t1.col = 1n’est pas valide.valueSpécifie la nouvelle valeur à définir dans
col_name.
Paramètres facultatifs¶
FROM additional_tablesSpé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 conditionExpression 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,
t1ett2), une ligne cible danst1peut ê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
targeten 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
targetmise à jour dans(0, 11)(valeurs de la ligne avec la valeur minimale pourvdanssrc) et ne donnera jamais lieu à une erreur.