SQL UPDATE verändert Werte vorhandener Zeilen – der DML-Befehl zum Ändern von Daten. Während INSERT neue Zeilen anlegt und DELETE welche entfernt, passt UPDATE bestehende Inhalte an.
Grundform
UPDATE kunden SET ort = 'Hamburg' WHERE id = 7;
SET weist einer oder mehreren Spalten neue Werte zu, WHERE bestimmt, welche Zeilen betroffen sind. Die größte Gefahr von UPDATE ist das fehlende WHERE:
UPDATE kunden SET ort = 'Hamburg'; -- ändert ALLE Zeilen!
Ohne WHERE-Bedingung aktualisiert das Statement jede Zeile der Tabelle – im SQL-Alltag einer der häufigsten Datenverluste. Vor größeren Änderungen hilft eine Transaktion oder ein Blick auf die betroffene Menge per SELECT mit derselben Bedingung.
Mehrere Spalten gleichzeitig
UPDATE kunden SET ort = 'Berlin', letzte_aenderung = NOW() WHERE id = 7;
Spaltenzuweisungen werden durch Kommas getrennt. Werte dürfen Ausdrücke enthalten – auch solche, die sich auf die bisherigen Spaltenwerte beziehen (SET anzahl = anzahl + 1). Bedingte Wertzuweisungen wie SET status = CASE WHEN alter > 60 THEN 'senior' ELSE status END formuliert man mit dem CASE-Ausdruck.
UPDATE mit Subquery und JOIN
Der neue Wert kann aus einer anderen Tabelle stammen:
UPDATE kunden SET region =
(SELECT region FROM plz_zuordnung WHERE plz_zuordnung.plz = kunden.plz)
WHERE region IS NULL;
MySQL und MariaDB erlauben außerdem das direkte Mehr-Tabellen-UPDATE mit JOIN:
UPDATE kunden k JOIN plz_zuordnung p ON p.plz = k.plz
SET k.region = p.region;
PostgreSQL und MariaDB können UPDATE mit einer CTE (WITH-Klausel) kombinieren, um Zwischenergebnisse sauber zu berechnen. Die JOIN-Syntax der SQL-JOINs gilt dabei entsprechend.
Gezielte Updates mit ORDER BY und LIMIT
UPDATE kunden SET status = 'inaktiv' WHERE status = 'alt'
ORDER BY id LIMIT 100;
MySQL/MariaDB erlauben ORDER BY und LIMIT im UPDATE – nützlich, um große Bereinigungsläufe in kleinen Portionen abzuarbeiten und die Datenbank nicht zu blockieren.
Praxis-Tipps
- Constraints gelten auch beim UPDATE: CHECK--, UNIQUE- und NOT-NULL-Regeln werden je geänderter Zeile geprüft.
- Betroffene Zeilenzahl liefert
ROW_COUNT()– 0 bedeutet: keine Zeile passte zur Bedingung (kein Fehler). - UPDATE löst keine AUTO_INCREMENT-Werte aus; die ID einer Zeile bleibt beim Ändern unverändert.
- In einer Transaktion lässt sich ein fehlerhaftes UPDATE vollständig zurückrollen – bei Massen-Updates immer einplanen.
- Trigger auf UPDATE-Ereignisse laufen automatisch mit – siehe Trigger.
Grundlagen zu Tabellenaufbau und Schlüsseln: Primär- und Fremdschlüssel.