wake-up-neo.com

Grundlagen von Fremdschlüsseln in MySQL?

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

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

Und im zweiten Teil der Frage, gibt es Verbesserungen, die durch die Verwendung der in MySQL eingebauten Fremdschlüssel erzielt werden können?

88
Macha

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

Sie verbessern Abfragen nicht im Sinne der Effizienz, sondern führen nur dazu, dass 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 department nicht löschen, wenn es einige employee hat.

Wenn Sie ON DELETE CASCADE zum FOREIGN KEY Definition werden die referenzierenden Zeilen automatisch zusammen mit den referenzierten Zeilen gelöscht.

Als Einschränkung FOREIGN KEY verlangsamt tatsächlich die Abfragen ein wenig.

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

115
Quassnoi

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_id Und Sie haben eine "Posts" -Tabelle, in der Posts an Themen mit der Spalte posts.topic_id Angehängt werden, 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, ID Nr. 1 hat, ist es unmöglich, dass ein Beitrag in der Datenbank vorhanden ist, die an Thema Nr. 2 angehängt ist. Die Datenbank stellt dies sicher.

Für den Vorteil der Kaskadierung können Sie festlegen, dass die Datenbank beim Löschen eines Themas aus der Thementabelle automatisch alle Posts in der Posts-Tabelle löscht, die an dieses Thema angehängt wurden. Das ist nett, weil es einen Schritt beseitigt, an den Sie sich erinnern müssen, manuell zu tun, was ziemlich komplex werden kann, wenn Sie viele Tabellen miteinander verknüpft haben. Mit Fremdschlüsseln können alle Beziehungen automatisch bereinigt werden.

31
Chad Birch

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

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

3. Wenn Sie 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) VERWEISE 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 als die übergeordnete Tabelle.
11
Gaurav Kumar

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

Wenn Sie den Wert in der Tabelle, auf die verwiesen wird, aktualisieren oder löschen, können Sie festlegen, dass der Wert automatisch aktualisiert wird, oder Sie können jede Zeile, die diesen Wert enthält, in Kaskade löschen.

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

6
Seb