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 = valeur

Indique la nouvelle valeur à mettre à jour dans la colonne de la table.

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 relation FROM. 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 t1.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 dans src :

    (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 pour v dans src) et ne donnera jamais lieu à une erreur.