Syntax für eine Tabelle:
UPDATE [LOW_PRIORITY] [IGNORE]tbl_name
SETcol_name1
=expr1
[,col_name2
=expr2
...] [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
Syntax für mehrere Tabellen:
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
=expr1
[,col_name2
=expr2
...] [WHEREwhere_condition
]
Bei der Ein-Tabellen-Syntax aktualisiert die
UPDATE
-Anweisung Spalten in vorhandenen
Datensätzen in tbl_name
mit neuen Werten.
Die SET
-Klausel gibt an, welche Spalten
geändert werden und welche Werte diese erhalten sollen. Sofern
angegeben, bestimmt die WHERE
-Klausel die
Bedingungen dafür, welche Datensätze geändert werden. Ohne
WHERE
-Klausel werden alle Datensätze
aktualisiert. Wenn die ORDER BY
-Klausel
vorhanden ist, werden die Datensätze in der angegebenen
Reihenfolge aktualisiert. Die LIMIT
-Klausel
kann die Anzahl der zu aktualisierenden Datensätze
beschränken.
Bei der Mehrtabellensyntax aktualisiert
UPDATE
in jeder Tabelle
table_references
die Datensätze, die
die Bedingungen erfüllen. In diesem Fall können ORDER
BY
und LIMIT
nicht verwendet
werden.
where_condition
ist ein Ausdruck, der
für jeden zu aktualisierenden Datensatz wahr ist. Er wird wie
in Abschnitt 13.2.7, „SELECT
“, beschrieben angegeben.
Die UPDATE
-Anweisung unterstützt die
folgenden Modifizierer:
Wenn Sie das Schlüsselwort LOW_PRIORITY
angeben, wird die Ausführung von UPDATE
verzögert, bis kein Client mehr aus der Tabelle liest.
Wenn Sie das Schlüsselwort IGNORE
verwenden, bricht die UPDATE
-Anweisung
auch dann nicht ab, wenn während der Aktualisierung Fehler
auftreten. Datensätze, bei denen Konflikte aufgrund von
Schlüsseldubletten auftreten, werden nicht geändert.
Datensätze, bei denen Spalten auf Werte gesetzt werden
würden, die Datenkonvertierungsfehler zur Folge hätten,
werden stattdessen auf den nächstgelegenen gültigen Wert
gesetzt.
Wenn Sie in einem Ausdruck auf eine Spalte in der Tabelle
tbl_name
zugreifen, verwendet
UPDATE
den aktuellen Wert der Spalte. So
erhöht die folgende Anweisung beispielsweise den aktuellen Wert
in der Spalte age
um 1:
UPDATE persondata SET age=age+1;
UPDATE
-Zuordnungen werden von links nach
rechts ausgewertet. Die folgende Anweisung etwa verdoppelt die
Spalte age
und erhöht sie dann um 1:
UPDATE persondata SET age=age*2, age=age+1;
Wenn Sie eine Spalte auf den Wert aktualisieren, den sie ohnehin gerade hat, dann bemerkt MySQL dies und führt keine Aktualisierung durch.
Wenn Sie eine als NOT NULL
deklarierte Spalte
aktualisieren, indem Sie sie auf NULL
setzen,
wird die Spalte stattdessen auf den für den jeweiligen Datentyp
vorgesehenen Standardwert gesetzt und der Warnungszähler
erhöht. Der Vorgabewert ist 0
bei
numerischen Typen, der Leer-String (''
) bei
String-Typen und der „Nullwert“ für Datums- und
Uhrzeittypen.
UPDATE
gibt die Anzahl der tatsächlich
geänderten Datensätze zurück. Die C-API-Funktion
mysql_info()
hingegen gibt die Anzahl der
Datensätze, die gefunden und aktualisiert wurden, sowie die
Anzahl der Warnungen zurück, die während der
UPDATE
-Operation aufgetreten sind.
Sie können LIMIT
verwenden, um den
Geltungsbereich von row_count
UPDATE
einzuschränken.
Eine LIMIT
-Klausel ist eine Beschränkung
für Datensätze. Die Anweisung endet, sobald eine Anzahl von
row_count
Datensätzen gefunden
wurde, die der WHERE
-Klausel entsprechen –
unabhängig davon, ob sie dann auch geändert wurden oder nicht.
Wenn eine UPDATE
-Anweisung eine
ORDER BY
-Klausel enthält, werden die
Datensätze in der in der Klausel angegebenen Reihenfolge
aktualisiert.
Sie können auch UPDATE
-Operationen
durchführen, die sich auf mehrere Tabellen beziehen. Allerdings
können Sie ORDER BY
oder
LIMIT
nicht in einer
UPDATE
-Anweisung für mehrere Tabellen
verwenden. Die Klausel
table_references
listet die Tabellen
auf, die im Join berücksichtigt werden. Die Syntax ist in
Abschnitt 13.2.7.1, „JOIN
“, beschrieben. Hier ein Beispiel:
UPDATE items,month SET items.price=month.price WHERE items.id=month.id;
Das obige Beispiel zeigt einen inneren Join, der den
Kommaoperator verwendet. UPDATE
-Anweisungen
für mehrere Tabellen können jedoch einen beliebigen Join-Typ
verwenden, der für SELECT
-Anweisungen
zulässig ist, also etwa LEFT JOIN
.
Sie benötigen die Berechtigung UPDATE
nur
für diejenigen in einer UPDATE
-Anweisung
für mehrere Tabellen referenzierten Spalten, die tatsächlich
geändert werden. Die Berechtigung SELECT
hingegen benötigen Sie für alle Spalten, die gelesen, aber
nicht modifiziert werden.
Wenn Sie eine UPDATE
-Anweisung für mehrere
Tabellen verwenden, die auch InnoDB
-Tabellen
einbezieht, für die Fremdschlüssel-Constraints vorhanden sind,
dann verarbeitet der MySQL-Optimierer die Tabellen unter
Umständen in einer Reihenfolge, die sich von der ihrer
Parent/Child-Beziehung unterscheidet. In diesem Fall schlägt
die Anweisung fehl, und es wird ein Rollback durchgeführt.
Stattdessen sollten Sie die Änderung dann in nur einer Tabelle
durchführen und sich auf die ON
UPDATE
-Funktionalität verlassen, die
InnoDB
bietet, um andere Tabellen
entsprechend zu ändern. Siehe auch
Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.
Zurzeit können Sie in einer Unterabfrage keine Aktualisierungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.