Foreign Keys mit MySQL InnoDB Tabellen
InnoDB Tabellen unterstützen seit Version 4.0 Foreign Keys.
Nun läst sich endlich auch in MySQl referentielle Integrität auf DB Ebene
herstellen.
Allerdings erkauft man sich dies mit dem InnoDB Tabellen Typ dessen
Performance deutlich unter den MyISAM Tabellen liegt!
Die Allgemeine Syntax lautet:
[CONSTRAINT symbol] FOREIGN KEY (index_col_name, ...) REFERENCES table_name (index_col_name, ...) [ON DELETE CASCADE | ON DELETE SET NULL]
Es gibt zwei Möglichkeiten Foreign Key Constrains einzusetzen. Zum einem beim CREATE TABLE zum anderem beim ALTER TABLE
z.B:
# CREATE # PARENT TABLE CREATE TABLE `autor` ( `id` int(10) NOT NULL , `name` varchar(128) NOT NULL default '', PRIMARY KEY (`id`), KEY `NAME` (`name`) ) TYPE=InnoDB;
# CHILD TABLE CREATE TABLE `buch` ( `id` int(10) NOT NULL, `autor_id` int(10) NOT NULL , PRIMARY KEY (`id`), INDEX idx_autor_id (autor_id), FOREIGN KEY (autor_id) REFERENCES autor(id) ON DELETE CASCADE ) TYPE=InnoDB
#ALTER ALTER TABLE buch ADD CONSTRAINT FK_Buch (autor_id) REFERENCES autor(id) ON DELETE CASCADE ;
Es lassen sich folgende Verhalten beim löschen [ON DELETE] bzw. (seit 4.0.7) update [ON UPDATE] definieren.
- CASCADE - alle damit verknüpften Datensätze werden gelöscht/upgedatet
- SET NULL - alle damit verknüpften Datensätze werden auf NULL gesetzt
- NO ACTION - es passiert nichts (Sinnvoll?)
- RESTRICT So lange noch Datensätze vorhanden sind kann kein Parent Wert gelöscht/geändert werden
z.B.:
ON DELETE SET NULL ON DELETE CASCADE
Entsprechend den Verhaltenseinstellungen müssen die Attribute (z.B. autor_id) entsprechende Datentypen/Eigenschaften haben (NOT NULL/NULL)
|