Advanced MySQL - Referentielle Integrität - Fremdschlüssel
1. Das Problem
... habe ich ja schon erläutert. Man hat eine Relation zwischen zwei Tabellen hergestellt. Also zum Beispiel so.
Tabelle A Tabelle B
+--+-------+------+ +--+-------+
|id|blubb |par_id| |id|laber |
+--+------ +------+ +--+-------+
|4 |blubber|1 | <--> | 1|schwall|
+--+------ +------+ +--+-------+
Was aber passiert, wenn man nun in Tabelle B den Eintrag mit der ID 1 löscht? Nun, dann kann der Datensatz aus Tabelle A nicht mehr den Eintrag aus B zugeordnet werden. Es gibt also einen logischen Bruch in der Datenbank.
Ganz wichtig!
Mit Fremdschlüsseln kann man nur bei InnoDb-Tabellen arbeiten. MyISAM unterstützt das nicht.
2. Referentielle Integrität
Um obiges Problem zu vermeiden arbeitet man mit einem Fremdschlüssel. Kommt es nun zu einer UPDATE
-, DELETE
-
oder INSERT
-Anweisung, so wird von MySQL geprüft. ob das zu einer "Lücke" führt. Und je nach Einstellung (dazu gleich
mehr) wird das dann entsprechend abgefangen.
3. Anlegen eines Fremdschlüssels
Das läuft über die Anweisungen FOREIGN KEY
und REFERENCES
. Ein kleines Beispiel dazu.
CREATE TABLE parent
(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child
(
id INT,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;
Erläuterung
Wichtig ist nur eine einzige Zeile. Nämlich die mit dem FOREIGN KEY (parent_id) REFERENCES parent(id)
. Damit legt man fest,
dass die Spalte parent_id
in child
ein Fremdschlüssel ist, der auf die Spalte id
in der Tabelle
parent
zeigt.
4. Das Ergebnis
Tabelle child Tabelle parent
+--+---------+ +--+-------+
|id|parent_id| |id|laber |
+--+---------+ FK* +--+-------+
|4 |1 | <--> | 1|schwall|
+--+---------+ +--+-------+
* FOREIGN KEY
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt