SQL Schnellstart – Fremdschlüssel
In der letzten Lektion hast du bereits erfahren, was ein Primärschlüssel ist. Du hast auch erfahren, dass es einen sogenannten "Fremdschlüssel" gibt. Nachfolgend erfährst du mehr zu Fremdschlüsseln.
Fremdschlüssel: Definition
Ein Fremdschlüssel ist ein Schlüssel, um zwei Tabellen miteinander zu verbinden. Dieser beschreibt eine Art Beziehung zu einer anderen Tabelle. Ein Fremdschlüssel verweist immer auf einen Primärschlüssel aus einer anderen oder derselben Tabelle.
Fremdschlüssel: Syntax
Wie man einen Fremdschlüssel setzt, hängt wieder von dem Datenbankmanagementsystem ab, das du benutzt. Häufig kannst du auch einfach eine grafische Benutzeroberfläche verwenden. Ich zeige dir jetzt, wie du mit SQL beim Erstellen einer Tabelle einen Fremdschlüssel setzen kannst:
CREATE TABLE Konto (
Kontonummer INT NOT NULL,
Kontostand DOUBLE,
KundenID INT NOT NULL,
PRIMARY KEY(Kontonummer),
FOREIGN KEY(KundenID) REFERENCES Kunde(KundenID)
);
Mit dem Schlüsselwort "FOREIGN KEY(Attribut) REFERENCES Tabelle(Primärschlüssel)" kann man einen Fremdschlüssel erzeugen. Hier verweist der Fremdschlüssel KundenID von Konto auf den Primärschlüssel KundenID von Kunde. Schau dir dazu folgendes Diagramm an:
Durch den Fremdschlüssel "KundenID" kann nun ein Konto genau einen Kunden zugeordnet werden. Wir haben nämlich definiert, dass KundenID "NOT NULL" sein muss, also zwingend einen Wert benötigt. Häufig sieht man auch folgende Notation:
CREATE TABLE Konto (
Kontonummer INT NOT NULL PRIMARY KEY,
Kontostand DOUBLE,
KundenID INT NOT NULL FOREIGN KEY REFERENCES Kunde(KundenID)
);
Hier musst du wieder darauf achten, welche Schreibweisen dein Datenbankmanagementsystem unterstützt.
Fremdschlüssel: Beispiel
Die Erklärung der Syntax ist im Grunde schon ein Beispiel, aber eines mit zwei Tabellen. Ich zeige dir nun ein Beispiel mit nur einer Tabelle.
Stell dir vor, du arbeitest in einem großen Unternehmen. Jede Person bis auf der "Top-Manager" hat einen vorgesetzten. Ein Arbeitskollege einer anderen Abteilung hat schon wieder das ganze Bier aus der Abteilung geklaut, in der du arbeitest. Nun möchtest du dich bei seinem Vorgesetzten beschweren. Glücklicherweise hat dieser Arbeitskollege seinen Mitarbeiterausweis liegen lassen. Dort steht die MitarbeiterID '2'.
Der Fremdschlüssel "VorgesetztenID" verweist auf den Primärschlüssel von Mitarbeiter. Ein Vorgesetzter ist nämlich auch ein Mitarbeiter. Ein Mitarbeiter hat immer einen vorgesetzten mit der Ausnahme vom CEO, dieser hat keinen, deshalb steht an Mitarbeiter [0;1]. Ein einfacher Datenbankentwickler ist nicht unbedingt ein Vorgesetzter und leitet somit auch keine anderen Mitarbeiter. Ein Mitarbeiter in der Position "IT-Manager" kann aber mehrere Mitarbeiter leiten, deshalb "[0;n]" (Ein Mitarbeiter kann keinen, einen oder mehrere Mitarbeiter leiten).
In der Tabellendefinition könnte das Ganze folgendermaßen aussehen:
CREATE TABLE Mitarbeiter (
MitarbeiterID INT NOT NULL PRIMARY KEY,
Vorname VARCHAR(255) NOT NULL,
Nachname VARCHAR(255) NOT NULL,
VorgesetztenID INT FOREIGN KEY REFERENCES Mitarbeiter(MitarbeiterID)
);
Und nun zu unserem eigentlichen Problem: Wir können dies in zwei Schritten lösen
- Wir benötigen die vorgesetztenID des Mitarbeiters mit der MitarbeiterID = 2
SELECT * FROM mitarbeiter WHERE MitarbeiterID = 2;
- Nachdem wir nun die VorgesetztenID haben (=1) müssen wir nur noch schauen, welcher Mitarbeiter dies ist.
SELECT * FROM Mitarbeiter WHERE MitarbeiterID = 1;
SQL-Challenge: Beispiel vereinfachen
Versuche dich erneut an JOINS zu erinner. Kann man dasselbe Ergebnis auch mit nur einer SQL-Anweisung erzielen? Eine mögliche Lösung findest du hier. Lösung:
SELECT Vorgesetzter.*
FROM mitarbeiter AS Mitarbeiter
INNER JOIN mitarbeiter AS Vorgesetzter ON Mitarbeiter.VorgesetztenID = Vorgesetzter.MitarbeiterID
WHERE Mitarbeiter.MitarbeiterID = 2;
Fazit
Mit Primärschlüsseln und Fremdschlüsseln kannst du ab sofort Beziehungen zwischen einer, zwei oder mehreren Tabellen herstellen. Du hast einige Schreibweisen kennengelernt, mit der du einen Fremdschlüssel setzen kannst. Bei manchen Datenbankmanagementsystemen kannst du eine grafische Benutzeroberfläche dafür verwenden.