## UPDATE-Anweisung (update_statement)

Die UPDATE-Anweisung (update_statement) ändert Spaltenwerte in Tabellenzeilen.

### Syntax

<update_statement> ::=
UPDATE [OF] <table_name> [<reference_name>] SET <set_update_clause>,... [KEY <key_spec>,...] [WHERE <search_condition>] [IGNORE TRIGGER] [NOWAIT]
| UPDATE [OF] <table_name> [<reference_name>] (<column_name>,...) VALUES (<extended_value_spec>,...) [KEY <key_spec>,...] [WHERE <search_condition>] [IGNORE TRIGGER] [NOWAIT]
| UPDATE [OF] <table_name> [<reference_name>] SET <set_update_clause>,... WHERE CURRENT OF <result_table_name> [NOWAIT]
| UPDATE [OF] <table_name> [<reference_name>] (<column_name>,...) VALUES (<extended_value_spec>,...) WHERE CURRENT OF <result_table_name> [NOWAIT]

<set_update_clause> ::= <column_name> = <extended_expression>
| <column_name>,... = (<extended_expression>,...)
| (<column_name>,...) = (<extended_expression>,...)
| <column_name> = <subquery>
| (<column_name>,...) = <subquery>

### Beispiele

SQL-Tutorial, Einfügen, Ändern, Löschen von Zeilen

### Erläuterung

Der Tabellenname muss eine existierende Basistabelle, View-Tabelle oder ein Synonym identifizieren.

Die Spalten, deren Werte geändert werden sollen, heißen Zielspalten. Nach Angabe des Tabellennamens und gegebenenfalls des Referenznamens werden eine oder mehrere Zielspalten und neue Werte für diese Spalten angegeben.

· Alle Zielspalten müssen Spalten der angegebenen Tabelle identifizieren, und jede Zielspalte darf nur einmal aufgeführt werden.

· Die Anzahl der angegebenen Spezifikationen von Werten extended_value_spec muss der Anzahl der Zielspalten entsprechen. Der i-ten Zielspalte ist die i-te Spezifikation eines Wertes zugeordnet.

· Der aktuelle Benutzer muss das UPDATE-Privileg für jede Zielspalte der angegebenen Tabelle besitzen.
Falls der Tabellenname eine View-Tabelle identifiziert, ist es möglich, dass selbst der Eigentümer der View-Tabelle keine Spaltenwerte ändern kann, weil die View-Tabelle nicht änderbar ist.

· Wenn die angegebene Tabelle eine View-Tabelle ist, werden nur Spaltenwerte von Zeilen von Basistabellen geändert, die der View-Tabelle zugrundeliegen. Die Zielspalten der angegebenen Tabelle korrespondieren in diesem Fall mit Spalten der Basistabellen, die der View-Tabelle zugrundeliegen. Im folgenden identifiziert der Begriff Zielspalte immer die korrespondierende Spalte der Basistabelle.

Siehe auch:

Datentyp der Zielspalte und Datentyp des einzufügenden Wertes

#### Welche Zeilen werden geändert

Welche Zeilen der angegebenen Tabelle geändert werden, wird durch eine der folgende Angaben festgelegt:

· Optionale Folge von Schlüsselspezifikation und optionale Suchbedingung
Schlüsselspezifikation und keine Suchbedingung: Es existiert eine Zeile mit den angegebenen Schlüsselwerten. Den Zielspalten dieser Zeile werden die korrespondierenden Werte zugewiesen. Wenn keine Zeile mit den angegebenen Schlüsselwerten existiert, wird keine Zeile geändert.
Schlüsselspezifikation und eine Suchbedingung: Es existiert eine Zeile mit den angegebenen Schlüsselwerten. Die Suchbedingung wird auf diese Zeile angewendet. Wenn die Suchbedingung erfüllt ist, werden den Zielspalten dieser Zeile die korrespondierenden Werte zugewiesen. Wenn keine Zeile mit den angegebenen Schlüsselwerten existiert oder eine auf eine Zeile angewandte Suchbedingung nicht erfüllt ist, wird keine Zeile geändert.
Keine Schlüsselspezifikation und eine Suchbedingung: Die Suchbedingung wird auf jede Zeile der angegebenen Tabelle angewendet. In allen Zeilen, die die Suchbedingung erfüllen, werden den Zielspalten die korrespondierenden Werte zugewiesen.

· Bei Verwendung von CURRENT OF, d.h. bei Angabe der Cursorposition innerhalb der Ergebnistabelle result_table_name: Wenn der Cursor nicht auf einer Zeile der Ergebnistabelle steht, wird keine Zeile geändert.

· Wurde keine der oben genannten möglichen Angaben vorgenommen, werden alle Zeilen der angegebenen Tabelle geändert.

· Wenn keine Zeile gefunden wird, die die durch die optionalen Klauseln definierten Bedingungen erfüllt, erscheint folgende Rückmeldung: 100 Zeile nicht gefunden

Auch Werte von Schlüsselspalten, die von einem Benutzer bei einer CREATE TABLE-Anweisung oder einer ALTER TABLE-Anweisung definiert wurden, können verändert werden. Die gegebenenfalls implizit angelegte Schlüsselspalte SYSKEY kann nicht verändert werden.

Wenn der Tabellenname eine Join-View-Tabelle angibt, können Spalten existieren, die nur in Kombination mit anderen Spalten geändert werden können.

#### Ermitteln der Spaltenkombination für eine Spalte einer Join-View-Tabelle

Um die Kombination von Spalten für eine gegebene Spalte v einer Join-View-Tabelle zu ermitteln, gehen Sie wie folgt vor:

...

1. Bestimmen Sie die Basistabelle Tj, in der die Spalte liegt, mit der v korrespondiert.

2. Bestimmen Sie die eindeutige Tabellenfolge Ti1...Tik, in der Tj liegt.

3. Bestimmen Sie die letzte Tabelle Ti1 dieser Folge, die zur Schlüsseltabelle in einer 1:1-Beziehung steht.

4. Die Spalten der Join-View-Tabelle, die mit den Fremdschlüsselspalten von Ti1 der für die Join-View-Tabelle relevanten referentiellen CONSTRAINT-Definition zwischen Ti1 und Ti1+1 korrespondieren, sind Elemente der Spaltenkombination.

5. Alle Spalten der Join-View-Tabelle, die mit Spalten der Tabellen Ti1+1...Tik korrespondieren, sind Element der Spaltenkombination.

Um den Spaltenwert der entsprechenden Spalte zu ändern, muss für alle Spalten der Spaltenkombination ein Wert angegeben werden. Dies gilt für alle Zielspalten, für die eine der folgenden Bedingungen gilt:

· Die Zielspalten liegen in einer Basistabelle, die nicht Schlüsseltabelle der Join-View-Tabelle ist und die nicht in einer 1:1-Beziehung zur Schlüsseltabelle der Join-View-Tabelle steht.

· Die Zielspalten sind Fremdschlüsselspalten einer für die Join-View-Tabelle relevanten referentiellen CONSTRAINT-Definition.

#### SET <set_update_clause>

Der Ausdruck in einer SET UPDATE-Klausel set_update_clause darf keine Set-Funktion enthalten.

Die Subquery muss eine Ergebnistabelle liefern, die höchstens eine Zeile enthält, und aus so vielen Spalten besteht wie Zielspalten angegeben sind.

#### IGNORE TRIGGER

Sie können durch Angabe von IGNORE TRIGGER steuern, dass durch die UPDATE-Anweisung kein UPDATE-Trigger ausgeführt wird. So können Sie Endlosrekursionen vermeiden, falls geänderte Zeilen im Trigger nochmal geändert werden.

#### CURRENT OF

Wenn CURRENT OF angegeben ist, muss der Tabellenname in der FROM-Klausel der QUERY-Anweisung, mit der die Ergebnistabelle result_table_name aufgebaut wurde, mit dem Tabellennamen in der UPDATE-Anweisung übereinstimmen.

Wenn CURRENT OF angegeben ist, und der Cursor auf einer Zeile der Ergebnistabelle steht, werden den Zielspalten der korrespondierenden Zeile die korrespondierenden Werte zugewiesen. Korrespondierend ist die Zeile aus der in der FROM-Klausel der QUERY-Anweisung angegebenen Tabelle, aus der die Zeile der Ergebnistabelle gebildet wurde. Voraussetzung dafür ist jedoch, dass die Ergebnistabelle mit FOR UPDATE spezifiziert wurde. Es kann keine Aussage darüber getroffen werden, ob die Änderung in der korrespondierenden Zeile beim nächsten Zugriff auf die gleiche Zeile der Ergebnistabelle sichtbar ist oder nicht.

#### NOWAIT

Wenn Sie NOWAIT angeben, dann wird im Fall einer Sperrkollision nicht auf die Freigabe einer Sperre gewartet, sondern sofort mit einem Fehler zurückgekehrt.

#### Gründe für das Scheitern der UPDATE-Anweisung

Wenn für Basistabellen, in denen durch die UPDATE-Anweisung Zeilen geändert wurden, CONSTRAINT-Definition en existieren, wird für jede geänderte Zeile geprüft, ob sie die CONSTRAINT-Definitionen erfüllt. Ist dies für mindestens eine geänderte Zeile nicht der Fall, scheitert die UPDATE-Anweisung.

Für jede Zeile, in der durch die UPDATE-Anweisung der Wert von Fremdschlüsselspalten geändert wurde, wird geprüft, ob der jeweils resultierende Fremdschlüssel als Schlüssel bzw. als Wert eines mit UNIQUE definierten Index in der korrespondierenden referenzierten Tabelle referenced_table existiert. Ist dies für mindestens eine geänderte Zeile der Fall, scheitert die UPDATE-Anweisung.

Für jede Zeile, in der durch die UPDATE-Anweisung der Wert einer referenzierten Spalte referenced_column einer referentiellen CONSTRAINT-Definition geändert werden soll, wird geprüft, ob Zeilen in der korrespondierenden Fremdschlüsseltabelle existieren, die die noch unveränderten Spaltenwerte als Fremdschlüssel enthalten. Ist dies für mindestens eine Zeile der Fall, scheitert die UPDATE-Anweisung.

Wenn für Basistabellen, in denen durch die UPDATE-Anweisung Zeilen geändert werden, Trigger definiert wurden, die nach einer UPDATE -Anweisung auszuführen sind, so werden diese ausgeführt. Scheitert einer dieser Trigger, scheitert die UPDATE -Anweisung.

#### Weitere Informationen

Spalten mit dem Datentyp LONG kann durch die UPDATE-Anweisung nur über einen Parameter oder durch Angabe von NULL ein Wert zugewiesen werden. Deshalb ist die Zuweisung von Werten an LONG-Spalten nur mit einigen Datenbankwerkzeugen möglich.