Ändert vorhandene Zeilen in Datenbanktabellen
UPDATE [ row-limitation ] table-expression [, ...] SET set-item[, ...] [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ] , ...] [ OPTION( query-hint, ... ) ]
table-expression: Ein Tabellenausdruck, der Joins, Outer-Joins, Ansichten und abgeleitete Tabellen enthalten kann. Siehe FROM-Klausel.
UPDATE [ row-limitation ] table-name SET set-item[, ...] FROM table-expression [, ...] ] [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ] , ...] [ OPTION( query-hint, ... ) ]
table-name : [ owner.]table-name [ [ AS ] correlation-name ] | [ owner.]view-name [ [ AS ] correlation-name ] | derived-table
derived-table : ( select-statement ) [ AS ] correlation-name [ ( column-name [, ...] ) ]
UPDATE table-name SET set-item, ... VERIFY ( column-name, ... ) VALUES ( expression, ... ) [ WHERE search-condition ] [ ORDER BY expression [ ASC | DESC ], ...] [ OPTION( query-hint, ... ) ]
UPDATE [ owner.]table-name PUBLICATION publication { SUBSCRIBE BY expression | OLD SUBSCRIBE BY expression NEW SUBSCRIBE BY expression } WHERE search-condition
row-limitation : FIRST | TOP { ALL | limit-expression } [ START AT startat-expression ] limit-expression : simple-expression startat-expression : simple-expression simple-expression : integer | variable | ( simple-expression ) | ( simple-expression { + | - | * } simple-expression )
set-item : [ correlation-name.]column-name = { expression | DEFAULT } | [owner-name.]table-name.column-name = { expression | DEFAULT } | @variable-name = expression
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name = option-value
table-name : [ owner.]base-table-name | temporary-table-name | derived-table-name | [ owner.]view-name
option-name : identifier
option-value : hostvar (Bezeichner zulässig) | string | identifier | number
UPDATE-Klausel Für Syntax 1 und Syntax 2 kann table-expression temporäre Tabellen, globale temporäre Tabellen, abgeleitete Tabellen oder Ansichten enthalten. Ansichten und abgeleitete Tabellen können aktualisiert werden, sofern sie aktualisierbar sind. Für Syntax 1 ergibt eine Liste von mehr als table-expression ein kartesisches Produkt der Zeilen, das aus den darunterliegenden Tabellenausdrücken gebildet wird und dann über die Verwendung der WHERE-Klausel eingeschränkt werden kann. Syntax 1 und Syntax 2 ermöglichen die Aktualisierung von Joins. Für Syntax 3 und 4 muss table-name eine Basistabelle sein.
UPDATE-Anweisungen können in Ansichten nur ausgeführt werden, wenn die Abfragespezifikation, die die Ansicht definiert, aktualisierbar ist.
row-limitation-Klausel Die Zeilenbeschränkungsklausel ermöglicht es Ihnen, die zu aktualisierenden Zeilen auf eine Teilmenge der Zeilen begrenzen, die von der WHERE-Klausel erfasst werden. Die Argumente TOP und START AT können einfache arithmetische Ausdrücke über Hostvariablen, Ganzzahlkonstanten oder Ganzzahlvariablen sein. Das TOP-Argument muss jedoch mit einem Wert größer oder gleich 0 ausgewertet werden. Das START AT-Argument mit einem Wert größer als 0 ausgewertet werden. Eine ORDER BY-Klausel sollte verwendet werden, um die Zeilen sinnvoll zu ordnen.
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 expression. Wenn der Ausdruck ein column-name ist, wird der alte Wert aus dieser Spalte 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 für diese Verwendung finden Sie im Abschnitt mit den Beispielen.
Sie können die SET-Klausel auch verwenden, um eine Variable zuzuordnen, indem Sie folgendes Format einsetzen:
SET @variable-name = expression, ... |
Bei Zuordnung eines Wert zu einer Variablen muss diese bereits deklariert sein und ihr Name muss mit dem At-Zeichen (@) beginnen. Wenn der Variablenname mit dem Namen einer Spalte in der zu aktualisierenden Tabelle übereinstimmt, aktualisiert die UPDATE-Anweisung den Spaltenwert und lässt die Variable unverändert. Variablen- und Spaltenzuordnungen können in jeder Reihenfolge vermischt werden.
FROM-Klausel Mit der optionalen Klausel FROM table-expression können Tabellen auf der Grundlage von Joins aktualisiert werden. table-expression kann beliebig komplexe Tabellenausdrücke wie OUTER-, CROSS- und NATURAL-Joins enthalten.
Wenn die FROM-Klausel vorliegt, muss mit table-name die einzige Tabelle angegeben werden, die aktualisiert werden soll, und der Name muss auf die gleiche Weise geschrieben sein, wie er in der FROM-Klausel erscheint. Wenn Korrelationsnamen in der FROM-Klausel verwendet werden, muss der identische Korrelationsname als table-name angegeben werden. Wenn der Tabellenausdruck, der aktualisiert werden soll, eine abgeleitete Tabelle ist, muss die abgeleitete Tabelle in der table-name-Spezifikation wiederholt werden.
Syntax 2 kann nicht benutzt werden, wenn die Option ansi_update_constraints auf Strict eingestellt ist.
Wenn eine FROM-Klausel angegeben ist, kann die SET-Klausel nur Spalten aus table-name zur Aktualisierung enthalten. Sonst wird eine Fehlermeldung ausgegeben.
Die folgende Anweisung veranschaulicht eine potenzielle Mehrdeutigkeit bei Tabellennamen in UPDATE-Anweisungen mit Syntax 2, die Tabellenausdrücke enthalten, die Korrelationsnamen verwenden:
UPDATE table_1 SET column_1 = ... FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
Hier hat jede Instanz von table_1 in der FROM-Klausel einen Korrelationsnamen, der einen Selbst-Join von table_1 mit sich selbst anzeigt. Die UPDATE-Anweisung gibt aber nicht an, welche der Zeilen, die den Selbst-Join darstellen, aktualisiert werden sollen. Dies kann durch die Angabe des Korrelationsnamens in der UPDATE-Anweisung wie folgt behoben werden:
UPDATE table_1 as alias_1 SET column_1 = ... FROM table_1 AS alias_1, table_1 AS alias_2 WHERE ... |
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.
Um die ORDER BY-Klausel verwenden zu können, darf die Option ansi_update_constraints nicht auf Strict eingestellt werden.
Um Spalten zu aktualisieren, die in der ORDER BY-Klausel erscheinen, muss die Option ansi_update_constraints auf OFF gesetzt werden.
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 = ... )
im Abfragetext Vorrang vor allen anderen Festlegungen der Isolationsstufe für eine Abfrage hat.
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 "Street" enthält, wird ein UPDATE eines Primärschlüssels einer anderen Zeile auf "street" zurückgewiesen, da sonst der Primärschlüssel nicht mehr eindeutig 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 3 und 4 gelten nur in SQL Remote.
Syntax 3 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 vorhandenen RESOLVE UPDATE-Trigger ausgelöst, bevor die Aktualisierung weitergeführt wird. Die UPDATE-Anweisung schlägt nicht fehl, weil es für die VERIFY-Klausel keine Übereinstimmung gab.
Syntax 4 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 4 der UPDATE-Anweisung enthält. So stellen Sie sicher, dass die Zeilen in ihren korrekten Subskriptionen bleiben.
Syntax 4 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 4 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, sodass sie die geänderten Werte darstellen.
Wenn eine Tabelle einen Primärschlüssel, eine UNIQUE-Integritätsregel oder einen UNIQUE-Index hat, kann die Verarbeitung der UPDATE-Anweisung die Verwendung einer temporären Tabelle umfassen, wenn die Tabellenmanipulationen nicht ohne Verletzung der Eindeutigkeits-Integritätsregel erfolgen können. Die temporäre Tabelle speichert von der UPDATE-Anweisung geänderte Zeilen, die eine oder mehrere Eindeutigkeits-Integritätsregeln verletzen. Diese Zeilen werden während des Ausführens der UPDATE-Anweisung aus der Basistabelle gelöscht und anschließend wieder eingefügt. Dieses Verhalten kann Auswirkungen auf AFTER-Trigger und andere gleichzeitige Verbindungen haben.
SQL/2008 Syntax 1 der UPDATE-Anweisung ist eine Kernfunktion des SQL/2008-Standards. Syntax 2 ist eine Erweiterung des Herstellers. Syntax 3 und 4 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 row-limitation.
Die Möglichkeit zur Angabe von mehr als einer table-list.
Die Möglichkeit zum Aktualisieren einer Variablen mit der SET-Klausel.
Die OPTION-Klausel.
Mit Syntax 1 kann die Einstellung der Option ansi_update_constraints gesteuert werden, 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.
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. Da die Anweisung eine ORDER BY-Klausel festlegt und das Sortierfolge Attribut auch in der SET-Klausel angegeben ist, muss die Option ansi_update_constraints auf "Off" gesetzt werden, weil sonst ein Fehler zurückgegeben wird.
Unter Verwendung der Beispieldatenbank ändert dieses dritte 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 ); |
Wieder unter Verwendung der Beispieldatenbank verwendet dieses vierte Beispiel die Syntax 2, um den Lagerbestand der T-Shirts zurückzusetzen, für die mindestens eine Bestellung vorhanden ist, deren Menge den aktuellen Lagerbestand überschreitet:
UPDATE Products AS a SET Quantity = 0 FROM Products a JOIN SalesOrderItems b ON a.ID = b.ProductID WHERE a.Name = 'Tee Shirt' AND b.Quantity > a.Quantity; |
In diesem fünften Beispiel wird die Syntax 1 verwendet, um sowohl den Lagerbestand für die Tee Shirts als auch das Lieferdatum (ShipDate) für die Tee Shirt-Bestellung auf das heutige Datum zurückzusetzen:
UPDATE Products a JOIN SalesOrderItems b on a.ID = b.ProductID SET a.Quantity = 0, b.ShipDate = CAST( NOW() AS DATE) WHERE a.Name = 'Tee Shirt' AND b.Quantity > a.Quantity |
Beispiele vier und fünf erfordern das Einstellen der Option ansi_update_constraints auf einen anderen Wert als Strict.
Im sechsten 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 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |