UPDATE ändert Spaltenwerte von Sätzen in einer Tabelle.
Bei partitionierten Tabellen darf der Primärschlüsselwert nicht geändert werden.
Die in der UPDATE-Anweisung (und in Voreinstellungen) vorkommenden Spezial-Literale (siehe "Spezial-Literale") sowie die Zeitfunktionen CURRENT_DATE, CURRENT_TIME und CURRENT_TIMESTAMP werden einmal ausgewertet, und die berechneten Werte gelten für alle Änderungen.
Um einen Satz in der angegebenen Tabelle zu ändern, müssen Sie Eigentümer dieser Tabelle sein oder das UPDATE-Privileg für jede zu ändernde Spalte besitzen. Zusätzlich muss der Transaktionsmodus der aktuellen Transaktion READ WRITE sein.
Sind für die Tabelle bzw. die betroffenen Spalten Integritätsbedingungen definiert, werden diese nach dem Ändern geprüft. Ist eine Integritätsbedingung verletzt, werden die Änderungen rückgängig gemacht und ein entsprechender SQLSTATE gesetzt.
UPDATE
tabelle [[AS]
korrelationsname ]
SET
spaltenangabe =
spaltenwert [,
spaltenangabe =
spaltenwert ]...
[WHERE {
suchbedingung | CURRENT OF
cursor }]
spaltenangabe ::= {
spalte |
spalte (
posnr ) |
spalte (
min..max ) }
spaltenwert ::= {
ausdruck | <{
wert | NULL},...> | DEFAULT | NULL }
tabelle
Name der Tabelle, in der Sätze geändert werden sollen. Die Tabelle kann eine Basistabelle oder ein änderbarer View sein.
korrelationsname
Tabellenname, der innerhalb dieser Anweisung eine Umbenennung für tabelle ist.
Bei jeder Spaltenangabe, die sich auf tabelle bezieht, müssen Sie den Spaltennamen mit dem neuen Namen korrelationsname qualifizieren, wenn der Spaltenname nicht eindeutig ist.
Der neue Name muss eindeutig sein, d.h. korrelationsname darf nur einmal in einer Tabellenangabe dieser Anweisung vorkommen.
Sie müssen eine Tabelle umbenennen, wenn die Spalten der Tabelle ohne Umbenennung nicht eindeutig angegeben werden können.
Außerdem können Sie eine Tabelle umbenennen, um durch entsprechende Namen einen Ausdruck verständlicher zu formulieren oder um lange Namen abzukürzen.
spalte
Name einer einfachen Spalte, deren Inhalt geändert werden soll. Die Spalte muss in der Tabelle enthalten sein. Eine Spalte darf nur einmal innerhalb einer UPDATE-Anweisung vorkommen.
spalte(posnr)
Element einer multiplen Spalte, dessen Wert geändert werden soll.
Die multiple Spalte muss in der Tabelle enthalten sein. Werden mehrere Elemente einer multiplen Spalte angegeben, muss der Teilbereich aus den angegebenen Spaltenelementen lückenlos sein. Jedes Element darf genau einmal vorkommen.
Für posnr geben Sie eine vorzeichenlose Ganzzahl >= 1 an.
spalte(min..max)
Teilbereich von Spaltenelementen einer multiplen Spalte, die mit Werten belegt werden sollen. Die multiple Spalte muss in der Tabelle enthalten sein. Werden mehrere Elemente einer multiplen Spalte angegeben, muss der Teilbereich aus den angegebenen Spaltenelementen lückenlos sein.
Jedes Element darf genau einmal vorkommen.
Für min und max geben Sie vorzeichenlose Ganzzahlen >= 1 an; max muss >= min sein.
ausdruck
Ausdruck, dessen Wert der vorangehenden einfachen Spalte zugeordnet wird. Der Wert des Ausdrucks muss mit dem Datentyp der Spalte verträglich sein (siehe Abschnitt „Werte in Tabellenspalten eintragen").
Ist ausdruck eine Benutzervariable, kann auch ein Vektor angegeben werden. Die Spalte muss dann eine multiple Spalte sein und die Anzahl der Elemente des Vektors muss mit der Anzahl der Spaltenelemente übereinstimmen.
Für ausdruck gelten folgende Einschränkungen:
Weder die tabelle zu Grunde liegende Basistabelle noch ein View auf diese Basistabelle dürfen in der FROM-Klausel einer Unterabfrage stehen, die in ausdruck vorkommt.
Mengenfunktionen (AVG, MAX, MIN, SUM, COUNT) sind nicht erlaubt.
<{
wert , NULL},...>
Aggregat, das einer multiplen Spalte zugewiesen werden soll.
Die Anzahl der Ausprägungen muss mit der Anzahl der Spaltenelemente übereinstimmen. Der Datentyp von wert muss mit dem Datentyp der Zielspalte verträglich sein (siehee Abschnitt „Werte in Tabellenspalten eintragen").
DEFAULT
Nur für einfache Spalte.
Die zugehörige Spalte wird mit dem voreingestellten Wert belegt, wenn eine Voreinstellung für die Spalte definiert ist. Sonst wird sie mit dem NULL-Wert belegt.
NULL
Der vorangehenden Spalte wird der NULL-Wert zugewiesen.
WHERE-Klausel
Die WHERE-Klausel gibt an, welche Sätze geändert werden.
WHERE-Klausel nicht angegeben:
Alle Sätze der Tabelle werden geändert.
suchbedingung
Bedingung, die die zu ändernden Sätze erfüllen müssen. Ein Satz wird nur geändert, wenn er die angegebene Suchbedingung erfüllt.
Für suchbedingung gelten folgende Einschränkungen:
Spaltenangaben in suchbedingung außerhalb von Unterabfragen dürfen sich nur auf die angegebene Tabelle beziehen.
Weder die tabelle zu Grunde liegende Basistabelle noch ein View auf diese Basistabelle dürfen in der FROM-Klausel einer Unterabfrage stehen, die in suchbedingung vorkommt.
Wenn kein Satz die Suchbedingung erfüllt, wird kein Satz verändert und ein SQLSTATE gesetzt, der mit WHENEVER NOT FOUND behandelt werden kann.
CURRENT OF cursor
Name des Cursors, über den der zu ändernde Satz bestimmt wird. tabelle muss die in der ersten FROM-Klausel der Cursorbeschreibung angegebene Tabelle sein.
Für den Cursor gelten folgende Bedingungen:
Der Cursor muss sich auf die Tabelle tabelle beziehen.
Der Cursor muss änderbar sein.
Der Cursor muss zum Ausführungszeitpunkt der UPDATE-Anweisung geöffnet und mit FETCH auf einen Satz der Tabelle positioniert sein. Zusätzlich muss die FETCH-Anweisung in derselben Transaktion erfolgt sein wie die UPDATE-Anweisung..
UPDATE ändert den Satz, auf den der Cursor cursor zeigt.
UPDATE ist nicht erlaubt, wenn für den Cursor cursor der Schubmodus eingeschaltet ist (siehe Abschnitt „Pragma PREFETCH").
Wurde der Cursor cursor mit der FOR UPDATE-Klausel und Spaltenangaben vereinbart, können nur die dort angegebenen Spalten geändert werden.
Die UPDATE-Anweisung beeinflusst die Position des Cursors nicht. Soll der nächste Satz der Ergebnistabelle geändert werden, müssen Sie den Cursor mit FETCH auf diesen Satz positionieren.
Werte einer multiplen Spalte ändern
Bei einer multiplen Spalte können Werte für einzelne Spaltenelemente sowie für Teilbereiche geändert werden.
Ein Element einer multiplen Spalte wird durch seine Positionsnummer in der multiplen Spalte angesprochen.
Ein Teilbereich einer multiplen Spalte wird durch die Positionsnummern des ersten und letzten Elements des Teilbereichs angesprochen.
UPDATE und Integritätsbedingungen
Durch Angabe von Integritätsbedingungen bei der Definition der Basistabelle können Sie den möglichen Inhalt von tabelle einschränken. Nach allen Änderungen durch die UPDATE-Anweisung muss der Inhalt von tabelle den definierten Integritätsbedingungen genügen.
UPDATE und änderbarer View
Ist bei der Definition eines änderbaren View CHECK OPTION angegeben, können nur Sätze in den View eingefügt werden, die den Abfrage-Ausdruck der View-Definition erfüllen.
UPDATE und Transaktionssicherung
UPDATE leitet außerhalb von Routinen eine Transaktion ein, wenn keine Transaktion offen ist. Durch die Definition eines Isolationslevels bei konkurrierenden Transaktionen können Sie steuern, welche Auswirkungen die UPDATE-Anweisung auf konkurrierende Transaktionen hat (siehe Abschnitt „SET TRANSACTION - Transaktionseigenschaften festlegen" ).
Tritt während der UPDATE-Anweisung ein Fehler auf, so werden sämtliche bereits durchgeführten Änderungen rückgängig gemacht.
Beispiele
Mindestbestand aller Artikel auf 20 erhöhen.
UPDATE artikel SET minbestand = 20 WHERE minbestand < 20
Änderung des Mindestbestands unter Verwendung eines Cursors:
DECLARE cur_artikel CURSOR FOR SELECT minbestand FROM artikel WHERE minbestand < 20 FOR UPDATE OPEN cur_artikel
Mit einer Folge von FETCH- und UPDATE-Anweisungen können die betroffenen Sätze geändert werden.
FETCH cur_artikel INTO :MINBESTAND UPDATE artikel SET minbestand = 20 WHERE CURRENT OF cur_artikel
Der Cursor CUR_MWST wählt alle Leistungen aus, für die keine Mehrwertsteuer berechnet wird. Mit einer Folge von FETCH- und UPDATE-Anweisungen können die betroffenen Sätzegeändert werden.
DECLARE cur_mwsatz CURSOR WITH HOLD FOR SELECT lnr, ltext, mwsatz FROM leistung WHERE mwsatz=0.00 FOR UPDATE OPEN cur_mwsatz FETCH NEXT cur_mwsatz INTO :LNR, :LTEXT INDICATOR :INDLTEXT, :MWSATZ INDICATOR :INDMWSATZ UPDATE leistung SET mwsatz =0.15 WHERE CURRENT OF cur_mwst ...
In der Tabelle FARBTAB wird für die Farbe orange die Intensität der einzelnen Farbkomponentengeändert. Die Spalte RGB für die Farbintensität ist eine multiple Spalte:
UPDATE farbtab SET rgb(1..3) = <0.8, 0.4, 0> WHERE farbname = 'orange'
Siehe auch
DELETE, INSERT, MERGE