Grundlagen von Fremdschlüsseln in MySQL?

91

Gibt es eine gute Erklärung für die Verwendung des Fremdschlüsselkonstrukts von MySQL?

Ich verstehe es nicht ganz aus den MySQL-Dokumenten selbst. Bis jetzt habe ich Dinge wie Fremdschlüssel mit Joins und Programmcode behandelt.

Und der zweite Teil der Frage: Gibt es Verbesserungen bei der Verwendung der in MySQL integrierten Fremdschlüssel?

Macha
quelle

Antworten:

117

FOREIGN KEYS Stellen Sie einfach sicher, dass Ihre Daten konsistent sind.

Sie verbessern Abfragen nicht im Sinne der Effizienz, sondern lassen nur einige falsche Abfragen fehlschlagen.

Wenn Sie eine Beziehung wie diese haben:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, dann können Sie ein nicht löschen, departmentwenn es einige hat employee.

Wenn Sie ON DELETE CASCADEdie FOREIGN KEYDefinition angeben, werden die referenzierenden Zeilen zusammen mit den referenzierten automatisch gelöscht.

Als Einschränkung FOREIGN KEYwerden die Abfragen tatsächlich etwas verlangsamt.

Beim Löschen aus einer referenzierten Tabelle oder beim Einfügen in eine referenzierende Tabelle muss eine zusätzliche Überprüfung durchgeführt werden.

Quassnoi
quelle
1
Die Verlangsamung ist minimal, da Sie normalerweise FK für indizierte Felder festlegen, wodurch das Auffinden der relevanten Werte zum Kinderspiel wird.
Seb
4
Deshalb habe ich "ein wenig" geschrieben :) Eigentlich, wenn Sie viele Zeilen löschen, ist der Basiswert JOINmöglicherweise viel weniger effizient als zwei DELETE, die FULL TABLE SCANs verwenden
Quassnoi
2
Entschuldigung für die Abwertung. Es war ein Zufall, aber es erlaubt mir nicht, meine Stimme zu ändern.
Wondercricket
8
@Wondercricket: Ich weiß nicht einmal, was ich jetzt tun soll, es ist eine Grauzone in den Site-Regeln. Ich glaube, du kaufst mir ein Bier, wenn du in Moskau bist und wir sind sogar.
Quassnoi
1
@stack: Jedes Update, das Sie an den referenzierten Schlüsselkaskaden der referenzierenden Tabelle vornehmen.
Quassnoi
32

Die Hauptvorteile der Verwendung von echten Fremdschlüsseln sind die Gewährleistung der Datenintegrität und die Möglichkeit, Kaskadenaktionen für verwandte Elemente einzurichten, wenn etwas geändert oder gelöscht wird.

Stellen Sie sich zum Beispiel vor, Sie programmieren ein Forum. Sie haben eine "Themen" -Tabelle mit Primärschlüssel topics.topic_idund eine "Beiträge" -Tabelle, in der Beiträge an Themen mit der Spalte angehängt werden posts.topic_id, die ein Fremdschlüssel für die Thementabelle ist.

Diese Fremdschlüsselbeziehung stellt sicher, dass jeder Beitrag einem gültigen Thema zugeordnet ist. Wenn das einzige Thema, das Sie haben, die ID Nr. 1 hat, kann in der Datenbank, die an Thema Nr. 2 angehängt ist, kein Beitrag vorhanden sein. Die Datenbank stellt dies sicher.

Für den Kaskadenvorteil können Sie es so einrichten, dass die Datenbank beim Löschen eines Themas aus der Thementabelle automatisch alle Beiträge in der Beitragstabelle löscht, die an dieses Thema angehängt wurden. Dies ist hilfreich, da dadurch ein Schritt entfernt wird, den Sie manuell ausführen müssen. Dies kann sehr komplex werden, wenn viele Tabellen miteinander verknüpft sind. Mit Fremdschlüsseln können alle Beziehungen automatisch bereinigt werden.

Chad Birch
quelle
11

1.FOREIGN KEYS stellen nur sicher, dass Ihre Daten konsistent sind.

2. Wenn wir die Löschkaskade auf die Fremdschlüsseldefinition anwenden, wird die referenzierende Zeile automatisch gelöscht, wenn die übergeordnete Zeile gelöscht wird.

3. Wenn wir Update Cascade auf die Fremdschlüsseldefinition anwenden, wird die untergeordnete Zeile automatisch aktualisiert, wenn die übergeordnete Zeile aktualisiert wird.

Abfrage: ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENZEN parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. Sie können keine direkte übergeordnete Tabelle löschen. Löschen Sie zuerst den Fremdschlüssel aus der untergeordneten Tabelle und dann die übergeordnete Tabelle.
Gaurav Kumar
quelle
7
Endlich wurde mir klar, was mich an fremden Schlüsselbeispielen verwirrte. Als Vater von vier Kindern bin ich es nicht gewohnt, dass das Kind den Elternteil im Auge behält . In weiteren vierzig Jahren scheint dies nicht mehr rückwärts zu sein.
Bob Stein
1
Vielen Dank, dass Sie Ihren Beispieltabellen Namen wie "Kind" und "Eltern" gegeben haben ... es ist eigentlich ziemlich hilfreich und ich wünschte, die offizielle Dokumentation hätte es geschafft!
Mike Nagetier
7

Der Hauptvorteil besteht darin, dass Sie einschränken können, welche Werte Sie in die Tabelle eingeben können. Wenn Sie versuchen, einen Wert einzugeben, der in der Tabelle, auf die verwiesen wird, nicht vorhanden ist, können Sie dies nicht tun.

Wenn Sie den Wert in der referenzierten Tabelle aktualisieren oder löschen, können Sie festlegen, dass der Wert automatisch aktualisiert oder eine Zeile mit diesem Wert in Kaskade gelöscht wird.

Es ist in der Tat eine großartige Funktion, die Ihren Code nutzt.

Seb
quelle