Eine Datenbank soll nicht nur Daten speichern, sondern auch sicherstellen, dass die Daten konsistent und eindeutig bleiben.
Dafür gibt es Schlüssel und Constraints (Einschränkungen).
🔹 Primärschlüssel (Primary Key)
Jede Tabelle braucht meist einen Primärschlüssel, der jeden Datensatz eindeutig identifiziert.
Beispiel:
CREATE TABLE kunden ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE );
👉 id
ist Primärschlüssel → automatisch eindeutige Werte.
🔹 Fremdschlüssel (Foreign Key)
Ein Fremdschlüssel verknüpft Tabellen miteinander.
Beispiel: Bestellungen gehören zu Kunden:
CREATE TABLE bestellungen ( id SERIAL PRIMARY KEY, kunde_id INT REFERENCES kunden(id), produkt VARCHAR(100), datum DATE DEFAULT CURRENT_DATE );
👉 kunde_id
muss auf eine gültige kunden.id
verweisen.
🔹 NOT NULL Constraint
Eine Spalte darf nicht leer bleiben:
name VARCHAR(100) NOT NULL
🔹 UNIQUE Constraint
Ein Wert darf nur einmal vorkommen (z. B. E-Mail):
name VARCHAR(100) NOT NULL
🔹 UNIQUE Constraint
Ein Wert darf nur einmal vorkommen (z. B. E-Mail):
email VARCHAR(150) UNIQUE
🔹 CHECK Constraint
Bedingungen erzwingen:
ALTER TABLE bestellungen ADD CONSTRAINT check_datum CHECK (datum >= '2000-01-01');
👉 Verhindert ungültige Daten.
🔹 DEFAULT Werte
Standardwerte setzen:
erstellt_am TIMESTAMP DEFAULT CURRENT_TIMESTAMP
🔹 Zusammengesetzter Primärschlüssel
Manchmal identifiziert die Kombination mehrerer Spalten einen Datensatz.
CREATE TABLE lagerbestand ( produkt_id INT, lager_id INT, menge INT, PRIMARY KEY (produkt_id, lager_id) );
🔹 Unterschiede zu MySQL/MariaDB
PostgreSQL ist bei Constraints strenger – falsche Daten werden sofort abgelehnt.
CHECK-Constraints werden in Postgres konsequent geprüft (in MySQL teilweise ignoriert).
Zusammengesetzte Schlüssel sind in Postgres üblich, in MySQL etwas seltener.
🔹 Übungen
1. Erstelle die Tabelle kunden
mit:
id SERIAL PRIMARY KEY
name VARCHAR(100) NOT NULL
email VARCHAR(150) UNIQUE
2. Erstelle die Tabelle bestellungen
mit:
id SERIAL PRIMARY KEY
kunde_id
als Fremdschlüssel auf kunden(id)
produkt VARCHAR(100)
datum DATE DEFAULT CURRENT_DATE
3. Füge zwei Kunden und je eine Bestellung ein.
4. Bonus: Ergänze in bestellungen
ein CHECK-Constraint, das datum
nicht in der Vergangenheit erlaubt.
✅ Zusammenfassung
- Primary Key → eindeutige Identifikation
- Foreign Key → Verknüpfung zwischen Tabellen
- NOT NULL, UNIQUE, CHECK sichern Datenqualität
- DEFAULT setzt Standardwerte
- PostgreSQL ist strenger und prüft Constraints konsequenter als MySQL
👉 Im nächsten Kapitel kümmern wir uns um Indizes & Performance – wie du Abfragen beschleunigen kannst.
📚 Inhaltsverzeichnis
👉 psql Kapitel 1: Installation & Anmeldung mit psql
👉 psql Kapitel 2: Benutzer & Rollen in PostgreSQL
👉 psql Kapitel 3: Datenbanken & Tabellen erstellen
👉 psql Kapitel 4: CRUD-Befehle (SELECT, INSERT, UPDATE, DELETE)
👉 psql Kapitel 5: Schlüssel & Constraints in PostgreSQL
👉 psql Kapitel 6: Indizes & Performance
👉 psql Kapitel 7: Erweiterungen & Spezialfunktionen
👉 psql Kapitel 8: Backups & Restore in PostgreSQL
⭐ Bonus-Kapitel
👉 psql Kapitel 9 (Bonus): Admin-Tipps & Best Practices für PostgreSQL