Ändert vorhandene Zeilen in Datenbanktabellen
UPDATE [ Zeilenbeschränkung ] Tabellenliste ] SET Mengenelement, ... [ FROM Tabellenausdruck [,...] ] [ WHERE Suchbedingung ] [ ORDER BY Ausdruck [ ASC | DESC ] , ... ] [ OPTION( Abfrage-Hint, ... ) ]
Tabellenliste : Tabellenname [,...]
Tabellenname : [ Eigentümer.]Tabellenname [ [ AS ] Korrelationsname ] | [ Eigentümer.]Ansichtsname [ [ AS ] Korrelationsname ] | Abgeleitete_Tabelle
Abgeleitete_Tabelle : ( Select-Anweisung ) [ AS ] Korrelationsname [ ( Spaltenname [,... ] ) ]
Tabellenausdruck : Ein vollständiger Tabellenausdruck, der Joins enthalten kann. Siehe FROM-Klausel.
UPDATE Tabellenname SET Mengenelement, ... VERIFY ( Spaltenname, ... ) VALUES ( Ausdruck, ... ) [ WHERE Suchbedingung ] [ ORDER BY Ausdruck [ ASC | DESC ], ... ] [ OPTION( Abfrage-Hint, ... ) ]
UPDATE [ Eigentümer.]Tabellenname PUBLICATION Publikation { SUBSCRIBE BY Ausdruck | OLD SUBSCRIBE BY Ausdruck NEW SUBSCRIBE BY Ausdruck } WHERE Suchbedingung
Zeilenbeschränkung : FIRST | TOP n [ START AT m ]
Mengenelement : [ Korrelationsname.]Spaltenname = { Ausdruck | DEFAULT } | [Eigentümername.]Tabellenname.Spaltenname = { Ausdruck | DEFAULT } | @Variablenname = Ausdruck
Abfragen-Hint : MATERIALIZED VIEW OPTIMIZATION Optionswert | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | Optionsname = Optionswert
Tabellenname : [ Eigentümer.]Basistabellenname | Temporärtabellenname | Abgeleitete_Tabellenname | [ Eigentümer.]Ansichtsname
Optionsname : Bezeichner
Optionswert : Hostvariable (Bezeichner zulässig), Zeichenfolge, Bezeichner oder Zahl
UPDATE-Klausel Für Syntax 1 kann Tabellenliste temporäre Tabellen, abgeleitete Tabellen oder Ansichten enthalten. Ansichten und abgeleitete Tabellen können aktualisiert werden, sofern sie aktualisierbar sind. Für Syntax 2 und 3 muss Tabellenname eine Basistabelle sein.
UPDATE-Anweisungen können in Ansichten nur ausgeführt werden, wenn die Abfragespezifikation, die die Ansicht definiert, aktualisierbar ist. Weitere Hinweise zur Erkennung von Ansichten, die inhärent nicht aktualisierbar sind, finden Sie unter Mit Ansichten arbeiten.
Zeilenbeschränkungsklausel Die Zeilenbeschränkungsklausel ermöglicht es Ihnen, eine Teilmenge der Zeilen zurückzugeben, die von der WHERE-Klausel erfasst werden. Die TOP- und START AT-Werte können eine Hostvariable, eine Ganzzahlkonstante oder eine Ganzzahlvariable sein. Der TOP-Wert muss mindestens 0 sein. Der START AT-Wert muss größer als 0 sein. Wenn diese Klauseln angegeben werden, wird normalerweise auch eine ORDER BY-Klausel angegeben, um die Zeilen sinnvoll zu ordnen. Siehe Die Anzahl der Zeilen, die von einer Abfrage zurückgegeben werden, explizit beschränken.
SET-Klausel Die SET-Klausel gibt die Spalten an, sowie die Art, wie die Werte geändert werden.
Sie können die SET-Klausel verwenden, um die Spalte auf einen berechneten Spaltenwert zu setzen, indem Sie folgendes Format verwenden:
SET column-name = expression, ... |
Jede benannte Spalte wird auf den Wert des Ausdrucks auf der rechten Seite des Gleichheitszeichens gesetzt. Es gibt keine Einschränkungen für Ausdruck. Wenn der Ausdruck ein Spaltenname ist, wird der alte Wert verwendet.
Wenn für eine Spalte ein Standardwert definiert ist, können Sie die SET-Klausel verwenden, um eine Spalte auf ihren Standardwert zu setzen. Ein Beispiel dafür finden Sie im Abschnitt mit den Beispielen.
Sie können die SET-Klausel auch verwenden, um eine Variable zuzuordnen, indem Sie folgendes Format verwenden:
SET @variable-name = expression, ... |
Bei Zuordnung einer Variablen muss diese bereits deklariert sein und ihr Name muss mit dem Klammeraffen (@) beginnen. Variablen- und Spaltenzuordnungen können gemischt werden, und die Verwendung jeglicher Zahl ist möglich. Wenn in der SET-Liste ein Name auf der linken Seite einer Zuordnung sowohl einer Spalte in der aktualisierten Tabelle als auch einem Variablennamen entspricht, wird die Anweisung die Spalte aktualisieren.
Folgendes Beispiel zeigt einen Ausschnitt der UPDATE-Anweisung. Es wird zusätzlich zum Aktualisieren der Tabelle eine Variable zugeordnet:
UPDATE T SET @var = expression1, col1 = expression2 WHERE... |
Das ist äquivalent zu Folgendem:
SELECT @var = expression1 FROM T WHERE... ; UPDATE T SET col1 = expression2 WHERE... |
FROM-Klausel Wenn die FROM-Klausel vorliegt, qualifiziert die WHERE-Klausel die Zeilen der FROM-Klausel.
Mit der optionalen Klausel FROM Tabellenausdruck können Tabellen auf der Grundlage von Joins aktualisiert werden. Tabellenausdruck kann beliebig komplexe Tabellenausdrücke wie KEY- und NATURAL-Joins enthalten. Eine ausführliche Beschreibung zur FROM-Klausel und zu Joins finden Sie unter FROM-Klausel.
Wenn eine FROM-Klausel verwendet wird, ist es wichtig, dass der Tabellenname in beiden Teilen der Anweisung gleich qualifiziert wird. Wenn ein Korrelationsname einmal verwendet wird, muss derselbe Korrelationsname auch an anderen Stellen verwendet werden. Sonst wird eine Fehlermeldung ausgegeben.
Die folgende Anweisung veranschaulicht eine potenzielle Mehrdeutigkeit bei Tabellennamen in UPDATE-Anweisungen mit zwei FROM-Klauseln, die Korrelationsnamen verwenden:
UPDATE FROM table_1 FROM table_1 AS alias_1, table_2 AS alias_2 WHERE ... |
Die Tabelle table_1 hat keinen Korrelationsnamen in der ersten FROM-Klausel, wohl aber in der zweiten FROM-Klausel. In diesem Fall wird Tabelle_1 in der ersten Klausel mit Alias_1 in der zweiten Klausel identifiziert: es gibt nur eine Instanz von Tabelle_1 in dieser Anweisung. Hierbei handelt es sich um eine zulässige Ausnahme der allgemeinen Regel, dass dort, wo eine Tabelle mit einem Korrelationsnamen in derselben Anweisung identifiziert wird, zwei Instanzen der Tabelle berücksichtigt werden.
Im folgenden Beispiel gibt es aber zwei Instanzen von table_1 in der zweiten FROM-Klausel. Die Anweisung schlägt mit einem Syntaxfehler fehl, da es unklar ist, welche Instanz von table_1 in der zweiten FROM-KLausel mit der ersten Instanz von table_1 in der ersten FROM-Klausel übereinstimmt.
UPDATE FROM table_1 FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
Diese Klausel ist nur zulässig, wenn ansi_update_constraints auf OFF gesetzt ist. Siehe ansi_update_constraints-Option.
Eine vollständige Beschreibung der Joins finden Sie unter Joins: Daten aus mehreren Tabellen abrufen.
Weitere Hinweise finden Sie unter FROM-Klausel.
WHERE-Klausel Wenn eine WHERE-Klausel angegeben ist, werden nur die Zeilen aktualisiert, welche die Suchbedingung erfüllen. Wenn keine WHERE-Klausel angegeben ist, wird jede Zeile aktualisiert.
ORDER BY-Klausel Normalerweise spielt die Reihenfolge, in der Zeilen aktualisiert werden, keine Rolle. In Verbindung mit der FIRST- oder TOP-Klausel kann die Reihenfolge jedoch wichtig sein.
Sie können Spalten-Ordinalnummern in der ORDER BY-Klausel nicht verwenden.
Sie dürfen keine Spalten aktualisieren, die in der ORDER BY-Klausel erscheinen, es sei denn, Sie setzen die Option ansi_update_constraints auf OFF. Siehe ansi_update_constraints-Option.
OPTION-Klausel Verwenden Sie diese Klausel, um Hints für das Ausführen der Anweisung anzugeben. Die folgenden Hints werden unterstützt:
OPTION( isolation_level = ... )
-Angabe im Abfragetext Vorrang vor allen anderen Festlegungen der Isolationsstufe für eine Abfrage hat.
Eine Beschreibung der Optionen, die mit der OPTION-Klausel in einer UPDATE-Anweisung festgelegt werden können, finden Sie unter OPTION-Klausel, SELECT-Anweisung.
In Tabellen eingefügte Zeichenfolgen werden immer in der gleichen Schreibung (groß oder klein) gespeichert, in der sie eingegeben wurden, unabhängig davon, ob die Datenbank die Groß-/Kleinschreibung berücksichtigt oder nicht. Eine Spalte vom Datentyp CHAR, die mit der Zeichenfolge "Street" aktualisiert wird, ist in der Datenbank immer mit einem großen S gespeichert, die restlichen Buchstaben sind klein geschrieben. SELECT-Anweisungen geben die Zeichenfolge als "Street" zurück. Wenn die Datenbank die Groß-/Kleinschreibung nicht berücksichtigt, wird bei Vergleichen "Street" genau so wie "street", "STREET" usw. behandelt. Wenn außerdem ein Primärschlüssel für eine Spalte einen Eintrag mit "Street" enthält, wird ein INSERT von "street" zurückgewiesen, da der Primärschlüssel dann nicht eindeutig gewesen wäre.
Wenn sich der neue Wert nicht vom alten unterscheidet, werden die Daten nicht verändert. BEFORE UPDATE-Trigger werden jedoch jedes Mal ausgelöst, wenn ein UPDATE einer Zeile stattfindet, ganz gleich, ob sich der neue Wert vom alten unterscheidet. AFTER UPDATE-Trigger lösen nur aus, wenn sich die neuen von den alten Werten unterscheiden.
Syntax 1 der UPDATE-Anweisung wird verwendet, um Zeilen einer oder mehrerer Tabellen zu ändern. Syntax 2 und 3 gelten nur in SQL Remote.
Syntax 2 ist nur für die Verwendung mit SQL Remote für Aktualisierungen von Einzelzeilen in einer einzigen Tabelle vorgesehen, die durch den Nachrichtenagenten ausgeführt werden. Die VERIFY-Klausel enthält eine Wertmenge, die in den zu aktualisierenden Zeilen erwartet wird. Wenn die Werte nicht übereinstimmen, werden alle RESOLVE UPDATE-Trigger ausgelöst, bevor die Aktualisierung weitergeführt wird. Die UPDATE-Anweisung schlägt nicht einfach fehl, wenn die VERIFY-Klausel nicht übereinstimmt.
Syntax 3 der UPDATE-Anweisung wird verwendet, um eine spezifische SQL Remote-Funktion zu implementieren und muss innerhalb eines BEFORE-Triggers verwendet werden. Diese Syntax dient dazu, bei jeder Listenänderung eine vollständige Liste von SUBSCRIBE BY-Werten bereitzustellen. Sie wird in SQL Remote-Triggern platziert, damit der Datenbankserver die aktuelle Liste von SUBSCRIBE BY-Werten ermitteln kann. Beide Listen werden im Transaktionslog abgelegt.
Der Nachrichtenagent verwendet diese zwei Listen, um sicherzustellen, dass die Zeile an alle entfernten Datenbanken übermittelt wird, die die Zeile noch nicht haben und jetzt benötigen. Der Nachrichtenagent entfernt die Zeile aus jeder entfernten Datenbank, welche diese Zeile hat, sie aber nicht länger benötigt. Eine entfernte Datenbank, die diese Zeile enthält und weiterhin benötigt, wird von der UPDATE-Anweisung nicht beeinflusst.
Bei Publikationen, die mit einer Unterabfrage in einer SUBSCRIBE BY-Klausel erstellt werden, müssen Sie einen Trigger schreiben, der Syntax 3 der UPDATE-Anweisung enthält. So stellen Sie sicher, dass die Zeilen in ihren korrekten Subskriptionen bleiben.
Syntax 3 der UPDATE Anweisung ermöglicht die explizite Angabe der alten SUBSCRIBE BY- und der neuen SUBSCRIBE BY-Liste, wodurch SQL Remote-Trigger wirksamer gemacht werden können. Wenn diese Listen nicht vorliegen, errechnet der Datenbankserver die alte SUBSCRIBE BY-Liste aus der Publikationsdefinition. Da sich die neue SUBSCRIBE BY-Liste im Allgemeinen nur leicht von der alten SUBSCRIBE BY-Liste unterscheidet, kann die Ermittlung der alten Liste zwei Mal erfolgen. Indem Sie sowohl die alte als auch die neue Liste angeben, können Sie diese zusätzliche Arbeit vermeiden.
Der Ausdruck SUBSCRIBE BY ist entweder ein Wert oder eine Unterabfrage.
Syntax 3 der UPDATE-Anweisung nimmt einen Eintrag in das Transaktionslog vor, ändert aber die Datenbanktabelle nicht.
Das Aktualisieren großer Datenmengen mit der UPDATE-Anweisung aktualisiert auch die Spaltenstatistiken.
UPDATE-Berechtigung für die zu ändernden Spalten ist erforderlich.
Spaltenstatistiken werden aktualisiert.
SQL/2008 Syntax 1 der UPDATE-Anweisung ist eine Kernfunktion des SQL/2008-Standards. Syntax 2 und 3 sind Erweiterungen des Herstellers nur für die Verwendung mit SQL Remote.
Syntax 1 enthält Unterstützung für zwei optionale SQL-Sprachenfunktionen:
Die Unterstützung für die Aktualisierung von Joins, möglicherweise einschließlich einer oder mehrerer abgeleiteter Tabellen, ist Teil der optionalen SQL-Sprachenfunktion T111 (aktualisierbare Joins, Vereinigungen und Spalten).
Die Unterstützung für das Ändern einer Tabelle, die in einer verschachtelten Unterabfrage referenziert wird, die wiederum Teil der Suchbedingung für die UPDATE-Anweisung ist, umfasst die optionale SQL/2008-Sprachenfunktion F781 (selbstreferenzierende Vorgänge).
Die folgenden Funktionen von Syntax 1 sind Erweiterungen des Herstellers:
Die Klauseln FROM und ORDER BY.
Die Klausel für die Zeilenbeschränkung.
Die Möglichkeit zum Angeben von mehr als einer Tabelle in der Tabellenliste.
Die Möglichkeit zum Aktualisieren einer Variablen mit der SET-Klausel.
Die OPTION-Klausel.
Die Einstellung der Option ansi_update_constraints steuert, welche Formen von Tabellenausdrücken geändert werden können. Um Kompatibilität mit SQL/2008-Kernfunktionen zu erzwingen, setzen Sie die Option ansi_update_constraints auf STRICT. Siehe ansi_update_constraints-Option.
Bei Verwendung der Beispieldatenbank transferiert das folgende Beispiel den Mitarbeiter Philip Chin (employee 129) von der Verkaufsabteilung in die Marketingabteilung.
UPDATE Employees SET DepartmentID = 400 WHERE EmployeeID = 129; |
Bei Verwendung der Beispieldatenbank nummeriert dieses Beispiel alle bestehenden Bestellaufträge neu, indem 2000 von der ID abgezogen wird.
UPDATE SalesOrders AS orders SET orders.ID = orders.ID - 2000 ORDER BY orders.ID ASC; |
Diese Aktualisierung ist nur möglich, wenn der Fremdschlüssel der Tabelle 'SalesOrderItems' (der den Primärschlüssel SalesOrders.ID referenziert) mit der Aktion ON UPDATE CASCADE definiert wird. Die Tabelle 'SalesOrderItems' wird dann ebenfalls aktualisiert.
Weitere Hinweise zu den Eigenschaften von Fremdschlüsseln finden Sie unter ALTER TABLE-Anweisung und CREATE TABLE-Anweisung.
Unter Verwendung der Beispieldatenbank ändert dieses Beispiel den Preis für ein Produkt auf Isolationsstufe 2, statt die aktuelle Isolationsstufeneinstellung für die Datenbank zu verwenden.
UPDATE Products SET UnitPrice = 7.00 WHERE ID = 501 OPTION( isolation_level = 2 ); |
Im folgenden Beispiel wird gezeigt, wie eine Tabelle aktualisiert wird, um eine Spalte auf ihren Standardwert zu setzen. In diesem Beispiel erstellen Sie die Tabelle MyTable, füllen sie mit Daten und führen dann eine UPDATE-Anweisung aus, in der mit der SET-Klausel festgelegt wird, dass die Spaltenwerte auf ihre Standardwerte gesetzt werden.
CREATE TABLE MyTable( PK INT PRIMARY KEY DEFAULT AUTOINCREMENT, TableName CHAR(128) NOT NULL, TableNameLen INT DEFAULT 20, LastUser CHAR(10) DEFAULT last user, LastTime TIMESTAMP DEFAULT TIMESTAMP, LastTimestamp TIMESTAMP DEFAULT @@dbts ); INSERT INTO MyTable WITH AUTO NAME SELECT LENGTH(t.table_name) AS TableNameLen, t.table_name AS TableName FROM SYS.SYSTAB t WHERE table_id<=10; UPDATE MyTable SET LastTime = DEFAULT, LastTimestamp = DEFAULT WHERE TableName LIKE '%sys%'; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |