Fremdschlüssel
Ein Fremdschlüssel (englisch: Foreign Key) ist ein Attribut oder eine Attributkombination in einer Datenbanktabelle, das auf den Primärschlüssel einer anderen Tabelle verweist. Fremdschlüssel sind ein fundamentales Konzept in relationalen Datenbanken und stellen Beziehungen zwischen Tabellen her. Sie gewährleisten die referenzielle Integrität der Daten, indem sie sicherstellen, dass nur gültige Referenzen auf existierende Datensätze möglich sind.
Funktion und Zweck von Fremdschlüsseln
Der Hauptzweck eines Fremdschlüssels besteht darin, die referenzielle Integrität zu erzwingen. Das bedeutet: In einer Fremdschlüsselspalte dürfen nur Werte stehen, die tatsächlich als Primärschlüssel in der referenzierten Tabelle existieren. Das Datenbankmanagementsystem prüft diese Bedingung automatisch bei jeder Änderung und verhindert ungültige Referenzen.
Stell dir vor, du hast eine Tabelle Kunden mit einer eindeutigen Kundennummer als Primärschlüssel und eine Tabelle Bestellungen. Jede Bestellung gehört zu einem Kunden. Der Fremdschlüssel in der Bestellungen-Tabelle stellt sicher, dass du keine Bestellung für einen nicht existierenden Kunden anlegen kannst.
Vorteile von Fremdschlüsseln
Fremdschlüssel bieten mehrere wichtige Vorteile für die Datenbankintegrität und -struktur:
- Datenintegrität: Verhindert verwaiste Datensätze und ungültige Referenzen
- Konsistenz: Stellt sicher, dass Beziehungen zwischen Tabellen immer gültig sind
- Dokumentation: Macht die Beziehungen zwischen Tabellen im Datenbankschema sichtbar
- Automatische Prüfung: Das DBMS prüft Constraints automatisch bei INSERT, UPDATE und DELETE
Fremdschlüssel in SQL definieren
In SQL kannst du Fremdschlüssel auf zwei Arten definieren: direkt bei der Tabellenerstellung mit CREATE TABLE oder nachträglich mit ALTER TABLE. Die Syntax variiert leicht zwischen verschiedenen Datenbanksystemen wie MySQL, PostgreSQL oder Microsoft SQL Server.
Fremdschlüssel bei der Tabellenerstellung
Das folgende Beispiel zeigt, wie du einen Fremdschlüssel beim Erstellen einer Tabelle definierst. Die Tabelle Bestellungen verweist über die Spalte kunden_id auf die id-Spalte der Tabelle Kunden:
CREATE TABLE Kunden (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255)
);
CREATE TABLE Bestellungen (
id INT PRIMARY KEY,
bestelldatum DATE NOT NULL,
kunden_id INT,
gesamtbetrag DECIMAL(10,2),
FOREIGN KEY (kunden_id) REFERENCES Kunden(id)
);
Fremdschlüssel nachträglich hinzufügen
Du kannst einen Fremdschlüssel auch zu einer bereits existierenden Tabelle hinzufügen. Dabei ist es sinnvoll, dem Constraint einen sprechenden Namen zu geben:
ALTER TABLE Bestellungen
ADD CONSTRAINT fk_bestellungen_kunden
FOREIGN KEY (kunden_id) REFERENCES Kunden(id);
Referenzielle Aktionen: ON DELETE und ON UPDATE
Ein wichtiger Aspekt von Fremdschlüsseln sind die referenziellen Aktionen. Sie legen fest, was passieren soll, wenn der referenzierte Datensatz in der Elterntabelle gelöscht oder geändert wird. SQL bietet dafür verschiedene Optionen:
| Aktion | Beschreibung |
|---|---|
| CASCADE | Änderungen werden automatisch auf alle referenzierenden Datensätze übertragen |
| SET NULL | Der Fremdschlüsselwert wird auf NULL gesetzt |
| SET DEFAULT | Der Fremdschlüsselwert wird auf den Standardwert gesetzt |
| RESTRICT | Die Änderung wird verhindert, wenn noch Referenzen existieren |
| NO ACTION | Ähnlich wie RESTRICT, Prüfung erfolgt am Ende der Transaktion |
Die Wahl der richtigen Aktion hängt von deinem Anwendungsfall ab. CASCADE ist praktisch, wenn abhängige Daten automatisch mitgelöscht werden sollen. RESTRICT ist sicherer, wenn du versehentliches Löschen verhindern möchtest.
Beispiel mit CASCADE
Mit ON DELETE CASCADE werden alle Bestellungen automatisch gelöscht, wenn der zugehörige Kunde gelöscht wird:
CREATE TABLE Bestellungen (
id INT PRIMARY KEY,
bestelldatum DATE NOT NULL,
kunden_id INT,
gesamtbetrag DECIMAL(10,2),
FOREIGN KEY (kunden_id) REFERENCES Kunden(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Fremdschlüssel im ER-Modell
Im Entity-Relationship-Modell (ER-Modell) werden Fremdschlüssel verwendet, um Beziehungen zwischen Entitäten abzubilden. Sie entstehen typischerweise bei der Umsetzung von 1:n-Beziehungen (eins-zu-viele) und n:m-Beziehungen (viele-zu-viele).
Bei einer 1:n-Beziehung wandert der Primärschlüssel der "1"-Seite als Fremdschlüssel in die Tabelle der "n"-Seite. Bei einer n:m-Beziehung wird eine Zwischentabelle (auch Verbindungstabelle genannt) erstellt, die zwei Fremdschlüssel enthält - je einen für jede der beteiligten Tabellen.
Beispiel: n:m-Beziehung mit Zwischentabelle
Ein typisches Beispiel ist die Beziehung zwischen Studenten und Kursen. Ein Student kann mehrere Kurse belegen, und ein Kurs kann von mehreren Studenten besucht werden:
CREATE TABLE Studenten (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE Kurse (
id INT PRIMARY KEY,
bezeichnung VARCHAR(100)
);
-- Zwischentabelle für n:m-Beziehung
CREATE TABLE Einschreibungen (
studenten_id INT,
kurs_id INT,
einschreibedatum DATE,
PRIMARY KEY (studenten_id, kurs_id),
FOREIGN KEY (studenten_id) REFERENCES Studenten(id),
FOREIGN KEY (kurs_id) REFERENCES Kurse(id)
);
Unterschied zwischen Primär- und Fremdschlüssel
Primärschlüssel und Fremdschlüssel erfüllen unterschiedliche Aufgaben in einer relationalen Datenbank, arbeiten aber eng zusammen:
| Eigenschaft | Primärschlüssel | Fremdschlüssel |
|---|---|---|
| Zweck | Identifiziert Datensätze eindeutig | Stellt Beziehungen zwischen Tabellen her |
| Eindeutigkeit | Muss eindeutig sein | Kann mehrfach vorkommen |
| NULL-Werte | Nicht erlaubt | Je nach Definition erlaubt |
| Anzahl pro Tabelle | Genau einer | Beliebig viele möglich |
| Referenz | Wird von Fremdschlüsseln referenziert | Verweist auf Primärschlüssel |
Ein Fremdschlüssel kann auch Teil eines zusammengesetzten Primärschlüssels sein, wie im obigen Beispiel der Einschreibungen-Tabelle. Dort bilden studenten_id und kurs_id gemeinsam den Primärschlüssel und sind gleichzeitig Fremdschlüssel.
Best Practices für Fremdschlüssel
Bei der Arbeit mit Fremdschlüsseln solltest du einige bewährte Praktiken beachten, um eine saubere und wartbare Datenbankstruktur zu erhalten:
- Sprechende Namen: Verwende aussagekräftige Namen für Constraints wie
fk_bestellungen_kunden - Indexierung: Lege Indizes auf Fremdschlüsselspalten an, um JOIN-Operationen zu beschleunigen
- Konsistente Namenskonvention: Benenne Fremdschlüsselspalten einheitlich, z.B.
tabelle_id - Referenzielle Aktionen: Wähle ON DELETE und ON UPDATE bewusst basierend auf deinen Anforderungen
- Dokumentation: Dokumentiere komplexe Beziehungen im Datenbankschema
Fremdschlüssel in der Praxis
Fremdschlüssel sind ein Kernkonzept relationaler Datenbanken und begegnen dir in nahezu jedem Datenbankprojekt. Ob du eine E-Commerce-Anwendung entwickelst, ein Content-Management-System aufbaust oder Unternehmenssoftware erstellst - überall werden Beziehungen zwischen Daten durch Fremdschlüssel abgebildet.
In der Ausbildung zum Fachinformatiker für Anwendungsentwicklung gehört das Verständnis von Fremdschlüsseln und referenzieller Integrität zu den grundlegenden Datenbankkompetenzen. Du wirst Fremdschlüssel beim Entwurf von ER-Diagrammen, bei der Normalisierung von Datenbanken und bei der Implementierung von SQL-Abfragen mit JOINs regelmäßig anwenden.