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.