Kategorien:

DML-Befehle – Allgemeines

UPDATE

Aktualisiert angegebene Zeilen in der Zieltabelle mit neuen Werten.

Unter diesem Thema:

Syntax

UPDATE <target_table>
       SET <col_name> = <value> [ , <col_name> = <value> , ... ]
        [ FROM <additional_tables> ]
        [ WHERE <condition> ]

Erforderliche Parameter

Zieltabelle

Gibt die zu aktualisierende Tabelle an.

Spaltenname = Wert

Gibt den neuen Wert an, der in der Tabellenspalte aktualisiert werden soll.

Optionale Parameter

FROM zusätzliche_Tabellen

Gibt eine oder mehrere Tabellen an, die zum Auswählen von zu aktualisierenden Zeilen oder zum Festlegen neuer Werte verwendet werden. Beachten Sie, dass die Wiederholung der Zieltabelle zu einer Selbstverknüpfung führt.

WHERE Bedingung

Ausdruck, der die zu aktualisierenden Zeilen in der Zieltabelle angibt.

Standard: Kein Wert (alle Zeilen der Zieltabelle werden aktualisiert)

Nutzungshinweise

  • Beim Aktualisieren von Zeilen auf Basis eines JOIN mit einer anderen Tabelle (in einer FROM-Klausel) kann eine Zielzeile mit vielen Zeilen in der FROM-Beziehung verknüpft werden. In diesem Fall steuert der Sitzungsparameter ERROR_ON_NONDETERMINISTIC_UPDATE das Ergebnis der Aktualisierung:

    • Bei FALSE (Standardwert) wird kein Fehler zurückgegeben, und eine der verknüpften Zeilen wird zum Aktualisieren der Zielzeile verwendet. Die ausgewählte verknüpfte Zeile ist jedoch nicht deterministisch.

    • IF TRUE wird ein Fehler zurückgegeben, der ein Beispiel für die Werte einer Zielzeile enthält, die mehrere Zeilen verbindet.

    So legen Sie den Parameter fest:

    ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;
    

Beispiele

Führen Sie ein Standard-Update mit zwei Tabellen aus:

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;

Aktualisieren Sie mit einer Verknüpfung, die nicht deterministische Ergebnisse liefert:

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 |
+------------------------+-------------------------------------+

Um dieses nicht deterministische Verhalten und diesen Fehler zu vermeiden, verwenden Sie eine 1-zu-1-Verknüpfung:

UPDATE target SET v = b.v
  FROM (SELECT k, MIN(v) v FROM src GROUP BY k) b
  WHERE target.k = b.k;

Diese Anweisung führt dazu, dass die einzelne Zeile in target auf (0, 11) aktualisiert wird (Werte aus der Zeile mit dem Mindestwert für v in src) und niemals zu einem Fehler führt.