ALTER TABLE
Lerne, wie du bestehende Tabellen änderst: Spalten hinzufügen, entfernen, umbenennen und Constraints nachträglich setzen.
Tabellen muessen sich mit deiner Anwendung weiterentwickeln. Mit ALTER TABLE kannst du bestehende Tabellen aendern, ohne sie neu erstellen zu muessen - Spalten hinzufuegen, entfernen, umbenennen und Constraints anpassen.
Grundsyntax
ALTER TABLE tabellenname
AKTION;
Spalten hinzufuegen
Neue Spalte hinzufuegen
-- Eine neue Spalte 'telefon' zur Kunden-Tabelle hinzufuegen
ALTER TABLE kunden
ADD COLUMN telefon TEXT;
Die neue Spalte wird bei allen bestehenden Datensaetzen mit NULL gefuellt (oder dem DEFAULT-Wert).
Spalte mit DEFAULT-Wert
-- Spalte mit Standardwert hinzufuegen
ALTER TABLE produkte
ADD COLUMN aktiv BOOLEAN DEFAULT TRUE;
-- Alle bestehenden Produkte haben jetzt aktiv = TRUE
Spalte mit NOT NULL
-- NOT NULL Spalte hinzufuegen (braucht einen DEFAULT-Wert!)
ALTER TABLE kunden
ADD COLUMN land TEXT NOT NULL DEFAULT 'DE';
Wichtig: Eine NOT NULL Spalte zu bestehenden Daten hinzuzufuegen braucht immer einen DEFAULT-Wert, da die bestehenden Zeilen sonst keinen Wert fuer die neue Spalte haetten.
Mehrere Spalten gleichzeitig (PostgreSQL)
-- PostgreSQL: Mehrere Spalten in einem Befehl
ALTER TABLE kunden
ADD COLUMN telefon TEXT,
ADD COLUMN geburtsdatum DATE,
ADD COLUMN newsletter BOOLEAN DEFAULT FALSE;
In SQLite musst du jeden ADD COLUMN einzeln ausfuehren:
-- SQLite: Einzeln ausfuehren
ALTER TABLE kunden ADD COLUMN telefon TEXT;
ALTER TABLE kunden ADD COLUMN geburtsdatum DATE;
ALTER TABLE kunden ADD COLUMN newsletter INTEGER DEFAULT 0;
Spalten entfernen
-- PostgreSQL: Spalte entfernen
ALTER TABLE kunden
DROP COLUMN telefon;
Hinweis: SQLite unterstuetzt DROP COLUMN erst ab Version 3.35.0. In aelteren Versionen muss die Tabelle neu erstellt werden.
Spalte entfernen mit abhaengigen Objekten
-- PostgreSQL: Spalte und abhaengige Objekte (Views, etc.) entfernen
ALTER TABLE kunden
DROP COLUMN telefon CASCADE;
Spalten umbenennen
-- PostgreSQL:
ALTER TABLE kunden
RENAME COLUMN stadt TO wohnort;
-- SQLite (ab Version 3.25.0):
ALTER TABLE kunden
RENAME COLUMN stadt TO wohnort;
Tabelle umbenennen
ALTER TABLE alte_tabelle
RENAME TO neue_tabelle;
Datentyp aendern (PostgreSQL)
-- Datentyp einer Spalte aendern
ALTER TABLE produkte
ALTER COLUMN preis TYPE NUMERIC(12,2);
-- Text zu Integer konvertieren (mit USING fuer die Konvertierung)
ALTER TABLE artikel
ALTER COLUMN menge TYPE INTEGER USING menge::INTEGER;
Hinweis: SQLite unterstuetzt das Aendern von Datentypen nicht direkt. Du musst die Tabelle neu erstellen.
Constraints aendern
NOT NULL hinzufuegen/entfernen (PostgreSQL)
-- NOT NULL hinzufuegen
ALTER TABLE kunden
ALTER COLUMN name SET NOT NULL;
-- NOT NULL entfernen
ALTER TABLE kunden
ALTER COLUMN telefon DROP NOT NULL;
DEFAULT setzen/entfernen
-- DEFAULT-Wert setzen
ALTER TABLE bestellungen
ALTER COLUMN status SET DEFAULT 'neu';
-- DEFAULT-Wert entfernen
ALTER TABLE bestellungen
ALTER COLUMN status DROP DEFAULT;
UNIQUE Constraint hinzufuegen
-- UNIQUE hinzufuegen
ALTER TABLE kunden
ADD CONSTRAINT uq_kunden_email UNIQUE (email);
CHECK Constraint hinzufuegen
-- CHECK hinzufuegen
ALTER TABLE produkte
ADD CONSTRAINT chk_preis_positiv CHECK (preis > 0);
FOREIGN KEY hinzufuegen
-- Fremdschluessel nachtraeglich hinzufuegen
ALTER TABLE bestellungen
ADD CONSTRAINT fk_bestellungen_kunden
FOREIGN KEY (kunden_id) REFERENCES kunden(id);
Constraint entfernen
-- PostgreSQL: Constraint nach Name entfernen
ALTER TABLE produkte
DROP CONSTRAINT chk_preis_positiv;
SQLite-Workaround: Tabelle neu erstellen
Da SQLite viele ALTER TABLE Operationen nicht unterstuetzt, nutzt man diesen Workaround:
-- Schritt 1: Neue Tabelle mit gewuenschter Struktur erstellen
CREATE TABLE kunden_neu (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE,
wohnort TEXT, -- umbenannt von 'stadt'
telefon TEXT, -- neue Spalte
registriert_am DATE DEFAULT CURRENT_DATE
);
-- Schritt 2: Daten kopieren
INSERT INTO kunden_neu (id, name, email, wohnort, registriert_am)
SELECT id, name, email, stadt, registriert_am
FROM kunden;
-- Schritt 3: Alte Tabelle loeschen
DROP TABLE kunden;
-- Schritt 4: Neue Tabelle umbenennen
ALTER TABLE kunden_neu RENAME TO kunden;
Wichtig: Fuehre diese Schritte in einer Transaktion aus!
BEGIN;
-- Alle vier Schritte hier
COMMIT;
Praxisbeispiele
Feature hinzufuegen: Bewertungssystem
-- Tabelle fuer Produktbewertungen erstellen
CREATE TABLE IF NOT EXISTS bewertungen (
id INTEGER PRIMARY KEY,
produkt_id INTEGER NOT NULL,
kunde_id INTEGER NOT NULL,
sterne INTEGER NOT NULL CHECK (sterne BETWEEN 1 AND 5),
kommentar TEXT,
erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (produkt_id) REFERENCES produkte(id) ON DELETE CASCADE,
FOREIGN KEY (kunde_id) REFERENCES kunden(id),
UNIQUE (produkt_id, kunde_id)
);
-- Durchschnittsbewertung zur Produkttabelle hinzufuegen
ALTER TABLE produkte
ADD COLUMN avg_bewertung DECIMAL(2,1) DEFAULT NULL;
Tabelle erweitern: Versandinformationen
-- Versand-Spalten zu Bestellungen hinzufuegen
ALTER TABLE bestellungen
ADD COLUMN versandart TEXT DEFAULT 'standard';
ALTER TABLE bestellungen
ADD COLUMN tracking_nr TEXT;
ALTER TABLE bestellungen
ADD COLUMN versendet_am TIMESTAMP;
Index hinzufuegen (Vorgeschmack)
-- Index fuer haeufig gesuchte Spalten
CREATE INDEX idx_kunden_stadt ON kunden(stadt);
CREATE INDEX idx_bestellungen_datum ON bestellungen(bestelldatum);
Migrationen: Aenderungen dokumentieren
In der professionellen Entwicklung werden Tabellenauenderungen als Migrationen dokumentiert:
-- Migration 001: Telefon-Spalte hinzufuegen
-- Datum: 2026-03-10
-- Beschreibung: Kunden koennen ihre Telefonnummer angeben
ALTER TABLE kunden ADD COLUMN telefon VARCHAR(20);
-- Migration 002: Newsletter-Spalte hinzufuegen
-- Datum: 2026-03-11
-- Beschreibung: Newsletter-Einwilligung tracken
ALTER TABLE kunden ADD COLUMN newsletter BOOLEAN DEFAULT FALSE;
Was kommt als Naechstes?
Im naechsten Tutorial lernst du Views kennen - virtuelle Tabellen, die komplexe Abfragen vereinfachen und wiederverwendbar machen.
Zusammenfassung
- ADD COLUMN fuegt neue Spalten hinzu
- DROP COLUMN entfernt Spalten (nicht in allen SQLite-Versionen)
- RENAME COLUMN benennt Spalten um
- ALTER COLUMN aendert Datentyp, DEFAULT oder NOT NULL (PostgreSQL)
- ADD CONSTRAINT fuegt nachtraeglich Constraints hinzu
- In SQLite sind viele Operationen nur ueber Tabelle neu erstellen moeglich
- Dokumentiere Aenderungen als Migrationen
Uebungen
- Spalte hinzufuegen: Fuege eine Spalte
gewicht_kg(Dezimalzahl) zur Produkttabelle hinzu. - DEFAULT setzen: Setze den Default-Wert der neuen Spalte auf 0.
- Constraint: Fuege einen CHECK-Constraint hinzu, der sicherstellt, dass das Gewicht positiv ist.
- Umbenennen: Benenne die Spalte
stadtin der Kunden-Tabelle zuwohnortum. - Migration: Schreibe eine vollstaendige Migration (mit Kommentaren), die der Bestellungen-Tabelle Versand-Informationen hinzufuegt.
-- Loesung zu Uebung 1 und 2:
ALTER TABLE produkte ADD COLUMN gewicht_kg DECIMAL(6,3) DEFAULT 0;
-- Loesung zu Uebung 3 (PostgreSQL):
ALTER TABLE produkte
ADD CONSTRAINT chk_gewicht CHECK (gewicht_kg >= 0);
Pro-Tipp: Teste ALTER TABLE Befehle immer zuerst in einer Entwicklungsdatenbank, nicht in der Produktionsdatenbank. Manche Aenderungen (wie das Aendern des Datentyps einer grossen Tabelle) koennen die Datenbank fuer laengere Zeit blockieren. In der Praxis nutzt man Migrations-Tools wie Flyway, Liquibase oder die eingebauten Migrations von Frameworks wie Django oder Rails.