Hauptmenü

Untermenü

Advanced MySQL - Referentielle Integrität - Fremdschlüssel - Referenzaktionen

1. Feintuning

Man kann das Verhalten von MySQL bei Fremdschlüsseln beeinflussen. Dabei existieren zwei Varianten, ON DELETE und ON UPDATE. Für beide Varianten gibt es dann die dazu gehörigen Aktionen.

Die Referenzaktionen sind Teil der FOREIGN KEY-Anweisung. Es darf also dazwischen kein Semikolon stehen.

2. CASCADE

ON DELETE CASCADE

Wenn man in der Elterntabelle einen Datensatz löscht, so werden ebenfalls alle Datensätze aus der Kindtabelle in die ewigen Jagdgründe befördert, die über den FOREIGN KEY damit verbunden sind.

ON UPDATE CASCADE

Wenn man in der Elterntabelle den Inhalt eines Feldes ändert, dass in der Kindtabelle als Fremdschlüssel definiert wurde, so werden in Letzterer die Fremdschlüsselwerte ebenfalls angepasst. Dazu ein kleines Beispiel.

Schritt 1

In der Elterntabelle wird id auf 2 gesetzt.


Kindtabelle              Elterntabelle
+--+-------+------+      +--+-------+
|id|blubb  |par_id|      |id|laber  |
+--+------ +------+      +--+-------+
||blubber|1     | <--> | 2|schwall|
+--+------ +------+      +--+-------+

Schritt 2

In der Kindtabelle wird dann automatisch die parent_id auf 2 gesetzt.


Kindtabelle              Elterntabelle
+--+-------+------+      +--+-------+
|id|blubb  |par_id|      |id|laber  |
+--+------ +------+      +--+-------+
||blubber|2     | <--> | 2|schwall|
+--+------ +------+      +--+-------+

3. SET NULL

Hier gibt es keinen Unterschied bei ON DELETE und ON UPDATE. Wird also der entsprechende Eintrag in der Elterntabelle gelöscht oder geändert, so setzt MySQL in der Kindtabelle den Wert der Fremdschlüsselspalte automatisch auf NULL. Allerdings darf der nicht mit NOT NULL festgelegt sein. Folgende Anweisungen führen daher zu einer Fehlermeldung.


CREATE TABLE parent 
(
  id INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child 
(
  id INT, 
  parent_id INT NOT NULL,
  FOREIGN KEY (parent_idREFERENCES parent(id) 
    ON UPDATE SET NULL
ENGINE=INNODB;

4. NO ACTION/RESTRICT

NO ACTION bezieht sich ausschließlich auf Primärschlüssel, die in anderen Tabellen als FOREIGN KEY benutzt werden. Und das kann man hier übersetzen mit "mach nix". Dasselbe gilt auch für RESTRICT. Nur kann man das auf jedweden erlaubten Spaltentyp anwenden. Beide Varianten sind eine vorgegebene Standardeinstellung.

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