Ab MySQL Server 3.23.44 unterstützt die
InnoDB
-Speicher-Engine die Überprüfung
von Fremdschlüsselbeschränkungen einschließlich
CASCADE
, ON DELETE
und
ON UPDATE
. Siehe auch
Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.
Bei anderen Speicher-Engines als InnoDB
verarbeitet MySQL Server zwar die FOREIGN
KEY
-Syntax in CREATE
TABLE
-Anweisungen, verwendet oder speichert sie aber
nicht. Zukünftig wird die Implementierung auf die Speicherung
dieser Information in der Tabellenspezifikationsdatei
erweitert, sodass sie mit mysqldump und
ODBC abgerufen werden kann. Zu einem späteren Zeitpunkt
werden Fremdschlüsselbeschränkungen auch für
MyISAM
-Tabellen implementiert werden.
Die Durchsetzung von Fremdschlüsseln bietet Datenbankentwicklern verschiedene Vorteile:
Setzt man einen guten Entwurf der Beziehungen voraus, dann erschweren Fremdschlüsselbeschränkungen es dem Programmierer, Inkonsistenzen in die Datenbank einzubringen.
Die zentralisierte Überprüfung der Beschränkungen durch den Datenbankserver macht eine Durchführung dieser Überprüfungen auf Anwendungsseite unnötig. Auf diese Weise wird die Möglichkeit beseitigt, dass verschiedene Anwendungen unter Umständen nicht alle Beschränkungen auf gleiche Weise überprüfen.
Dank der Verwendung kaskadierender Updates und Löschungen kann der Anwendungscode vereinfacht werden.
Korrekt entworfene Fremdschlüsselregeln unterstützen Sie bei der Dokumentation von Beziehungen zwischen Tabellen.
Denken Sie in jedem Fall daran, dass diese Vorteile auf Kosten einer zusätzlichen Belastung des Datenbankservers entstehen, da dieser die erforderlichen Überprüfungen durchführen muss. Weitere Überprüfungen durch den Server beeinträchtigen die Leistungsfähigkeit in so hohem Maße, dass sie für bestimmte Anwendungen vermieden werden sollten, sofern dies möglich ist. (Aus diesem Grund ist die Fremdschlüssellogik bei einigen größeren kommerziellen Anwendungen auch auf Anwendungsebene programmiert.)
MySQL stellt Datenbankprogrammierern die Auswahl des zu
verwendenden Ansatzes frei. Wenn Sie keine Fremdschlüssel
benötigen und die Mehrbelastung des Servers bei der
Durchsetzung der referenziellen Integrität vermeiden wollen,
können Sie stattdessen eine andere Speicher-Engine wie etwa
MyISAM
auswählen. (Die
MyISAM
-Engine bietet eine sehr gute
Performance für Anwendungen, die nur
INSERT
- und
SELECT
-Operationen durchführen. In solchen
Fällen weist die Tabelle keine Löcher in der Mitte auf, und
das Einfügen und Abrufen von Daten kann gleichzeitig
erfolgen. Siehe auch Abschnitt 7.3.2, „Themen, die Tabellensperren betreffen“.)
Wenn Sie sich dafür entscheiden, die Vorteile der Überprüfung der referenziellen Integrität nicht zu nutzen, dann sollten Sie die folgenden Gesichtspunkte in Ihre Überlegungen mit einbeziehen:
Fehlt die serverseitige Überprüfung der Fremdschlüsselbeziehung, dann muss die Anwendung sich selbst um die Aspekte der Beziehung kümmern. Sie muss beispielsweise dafür sorgen, dass Datensätze in der korrekten Reihenfolge in Tabellen eingetragen werden und dass keine verwaisten Unterdatensätze erstellt werden. Ferner muss sie in der Lage sein, Fehler, die bei Einfügevorgängen für mehrere Datensätze auftreten, beheben zu können.
Wenn ON DELETE
die einzige
referenzielle Integritätsfunktion ist, die eine Anwendung
benötigt, dann können Sie ab MySQL Server 4.0 einen
ähnlichen Effekt erzielen, indem Sie
DELETE
-Anweisungen über mehrere
Tabellen verwenden; so können Sie Datensätze aus
mehreren Tabellen mit nur einer Anweisung löschen. Siehe
auch Abschnitt 13.2.1, „DELETE
“.
Ein Workaround für das Fehlen von ON
DELETE
besteht darin, die passenden
DELETE
-Anweisungen in Ihrer Anwendung
hinzuzufügen, wenn Sie Datensätze aus einer Tabelle
löschen, die einen Fremdschlüssel beinhaltet. In der
Praxis kann dies häufig ebenso schnell sein wie die
Verwendung von Fremdschlüsseln – und ist zudem besser
portierbar.
Denken Sie daran, dass der Einsatz von Fremdschlüsseln unter Umständen zu Problemen führen kann:
Die Unterstützung von Fremdschlüsseln beseitigt eine Reihe von Schwierigkeiten bei der referenziellen Integrität, aber es ist nach wie vor erforderlich, Schlüsselbeziehungen mit Sorgfalt zu erstellen, damit zirkulare Regeln oder falsche Kombinationen kaskadierender Löschungen ausgeschlossen werden.
Es kommt häufig vor, dass ein Datenbankadministrator eine Beziehungstopologie erstellt, die die Wiederherstellung einzelner Tabellen aus einem Backup erschwert. (MySQL schwächt dieses Problem ab, indem es Ihnen die temporäre Deaktivierung von Fremdschlüsselüberprüfungen gestattet, wenn Sie eine Tabelle neu laden, die von anderen Tabellen abhängt. Siehe auch Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“. Ab MySQL 4.1.1 erzeugt mysqldump Speicherauszugsdateien, die diesen Vorteil automatisch nutzen, wenn sie neu geladen werden.)
Beachten Sie, dass Fremdschlüssel in SQL zur Überprüfung
und Durchsetzung der referenziellen Integrität verwendet
werden, nicht jedoch zur Verknüpfung von Tabellen. Wenn Sie
mit einer SELECT
-Abfrage Ergebnisse aus
mehreren Tabellen abrufen wollen, tun Sie dies mithilfe eines
Joins dieser Tabellen:
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
Siehe auch Abschnitt 13.2.7.1, „JOIN
“, und
Abschnitt 3.6.6, „Wie Fremdschlüssel verwendet werden“.
Die FOREIGN KEY
-Syntax ohne ON
DELETE ...
wird von ODBC-Anwendungen häufig zur
Erzeugung automatischer WHERE
-Klauseln
verwendet.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.