Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (P-Z)

 

UPDATE-Anweisung

Mit dieser Anweisung ändern Sie bestehende Zeilen in Datenbanktabellen.

Syntax 1
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. Weitere Hinweise finden Sie unter FROM-Klausel.
Syntax 2
UPDATE Tabellenname
SET Mengenelement, ...
VERIFY ( Spaltenname, ... ) VALUES ( Ausdruck, ... ) 
[ WHERE Suchbedingung ]
[ ORDER BY Ausdruck [ ASC | DESC ], ... ]
[ OPTION( Abfrage-Hint, ... ) ]
Syntax 3
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
Abfrage-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
Parameter
  • 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. Weitere Hinweise finden Sie unter 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. Der 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. Weitere Hinweise finden Sie unter ansi_update_constraints-Option [Kompatibilität].

    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. Weitere Hinweise finden Sie unter ansi_update_constraints-Option [Kompatibilität].

  • OPTION-Klausel   Verwenden Sie diese Klausel, um Hints für das Ausführen der Anweisung anzugeben. Die folgenden Hints werden unterstützt:

    • MATERIALIZED VIEW OPTIMIZATION Optionswert
    • FORCE OPTIMIZATION
    • FORCE NO OPTIMIZATION
    • Optionsname = Optionswert

Bemerkungen

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 einfach fehl, weil 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.

Berechtigungen

UPDATE-Berechtigung für die zu ändernden Spalten ist erforderlich.

Nebenwirkungen

Spaltenstatistiken werden aktualisiert.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Syntax 1 ist außer für die Klauseln FROM und ORDER BY, die Erweiterungen des Herstellers sind, eine Entry-Level-Funktion. Syntax 2 und 3 sind Erweiterungen des Herstellers nur für die Verwendung mit SQL Remote.

    Um SQL/2003-Kompatibilität zu erzwingen, setzen Sie die Option ansi_update_constraints auf STRICT Weitere Hinweise finden Sie unter ansi_update_constraints-Option [Kompatibilität].

Beispiele

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 Informationen 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%';