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.
CASCADE
SET NULL
NO ACTION
RESTRICT
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 |
+--+------ +------+ +--+-------+
|4 |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 |
+--+------ +------+ +--+-------+
|4 |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_id) REFERENCES 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