Hauptmenü

Untermenü

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  |
+--+------ +------+      +--+-------+
||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_idREFERENCES 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*  +--+-------+
||1        | <--> | 1|schwall|
+--+---------+      +--+-------+

* FOREIGN KEY

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt