ALTER TABLE ändert die Struktur einer bestehenden Tabelle: Spalten kommen dazu, verschwinden oder ändern ihren Typ. Während CREATE TABLE die Struktur einmalig anlegt, begleitet ALTER TABLE ein Schema über seine gesamte Lebensdauer – jede Anforderung von morgen bedeutet meist ein ALTER von heute.
Spalten hinzufügen und entfernen
ALTER TABLE kunden ADD COLUMN newsletter BOOLEAN DEFAULT FALSE;
ALTER TABLE kunden DROP COLUMN newsletter;
ADD COLUMN hängt eine neue Spalte ans Tabellenende (mit FIRST oder AFTER spalte lässt sich die Position steuern). DROP COLUMN entfernt Spalte samt Daten – unwiderruflich.
Datentypen und Namen ändern
Ein VARCHAR(50), das zu klein wird, lässt sich erweitern:
ALTER TABLE kunden MODIFY COLUMN name VARCHAR(200) NOT NULL;
ALTER TABLE kunden RENAME COLUMN name TO vollname;
MySQL/MariaDB nutzen dafür MODIFY COLUMN, PostgreSQL und SQL Server ALTER COLUMN – die Syntax ist je Datenbank verschieden. Eine Verkleinerung oder ein Typwechsel kann fehlschlagen, wenn vorhandene Daten nicht hineinpassen.
Constraints nachrüsten
ALTER TABLE kunden ADD CONSTRAINT uq_email UNIQUE (email);
ALTER TABLE kunden ADD CONSTRAINT fk_stadt FOREIGN KEY (stadt_id) REFERENCES staedte(id);
ALTER TABLE kunden DROP CONSTRAINT uq_email;
Regeln lassen sich so nachträglich ergänzen, ohne die Tabelle neu aufzubauen – der passende Hintergrund steht bei UNIQUE-, NOT NULL- und CHECK-Constraint.
Migrationen und Online-DDL
Strukturänderungen an großen Tabellen sind heikel: MySQL/MariaDB mit InnoDB können ADD COLUMN seit Version 8.0 bzw. 10.3 oft als INSTANT-Operation nur an den Metadaten ausführen – die Tabelle wird nicht kopiert, der Eingriff dauert Millisekunden. Nicht alle Änderungen sind INSTANT-fähig; manche brauchen einen Tabellen-Rebuild und sperren währenddessen Schreibzugriffe. Deshalb versioniert man Schema-Änderungen in der Praxis über Migrationen (Flyway, Liquibase) statt sie von Hand auf der Produktion auszuführen – der Datenbankschema-Artikel zeigt das Muster.
Fallstricke
- DDL ist nicht überall transaktional: In MySQL/MariaDB löst jedes ALTER TABLE einen impliziten Commit aus – ein Fehler mittendrin lässt sich nicht zurückrollen. PostgreSQL erlaubt ALTER TABLE dagegen innerhalb von Transaktionen.
- Metadaten-Sperren: Läuft gerade eine lange Abfrage auf der Tabelle, wartet das ALTER (oder blockiert umgekehrt neue Anfragen).
- NOT NULL ohne DEFAULT: Das Nachrüsten auf eine Spalte mit Bestandsdaten schlägt fehl, solange NULL-Werte existieren.
- Mehrere Änderungen: Viele Datenbanken erlauben
ALTER TABLE ... ADD COLUMN a ..., ADD COLUMN b ...in einem Statement – das ist schneller und atomarer als Einzelbefehle.
Wer eine Tabelle komplett loswerden will, findet die Unterschiede bei DROP TABLE.