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