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> ]
Copy

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 et t2), une ligne cible dans t1 peut être jointe (c’est-à-dire correspondre) à plus d’une ligne de la table t2. 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;
    
    Copy

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;
Copy

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 |
+------------------------+-------------------------------------+
Copy
  • 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;
Copy

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.