Detaillierte Erläuterung der MySQL-Fremdschlüsseleinschränkungen

Detaillierte Erläuterung der MySQL-Fremdschlüsseleinschränkungen

Amtliche Dokumentation:
https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

1. Fremdschlüsselfunktion:

MySQL verwendet Fremdschlüsseleinschränkungen, um die Integrität und Genauigkeit der Daten zwischen Tabellen sicherzustellen.

2. Bedingungen für die Verwendung von Fremdschlüsseln

  • Beide Tabellen müssen InnoDB-Tabellen sein. MyISAM-Tabellen unterstützen derzeit keine Fremdschlüssel (es wird gesagt, dass zukünftige Versionen dies möglicherweise unterstützen, aber zumindest wird es derzeit nicht unterstützt).
  • Für die Fremdschlüsselspalte muss ein Index erstellt werden. MySQL 4.1.2 und spätere Versionen erstellen beim Erstellen eines Fremdschlüssels automatisch einen Index. Wenn Sie jedoch eine frühere Version verwenden, müssen Sie explizit einen Index erstellen.
  • Die Spalten der beiden Tabellen in der Fremdschlüsselbeziehung müssen ähnliche Datentypen aufweisen, also Spalten, die ineinander konvertiert werden können, wie etwa int und tinyint, aber nicht int und char.

3. Grammatik erstellen

[CONSTRAINT [Symbol]] Fremdschlüssel
[Indexname] (Spaltenname, …)
REFERENZEN tbl_name (col_name, …)
[ON DELETE Referenzoption]
[ON UPDATE Referenzoption]

Referenzoption:
EINSCHRÄNKEN | KASKADE | AUF NULL SETZEN | KEINE AKTION | STANDARD FESTLEGEN

Diese Syntax kann in CREATE TABLE und ALTER TABLE verwendet werden. Wenn Sie das Symbol CONSTRAINT nicht angeben, generiert MYSQL automatisch einen Namen.
ON DELETE und ON UPDATE geben Einschränkungen für die Ereignisauslösung an und Sie können Parameter festlegen:
RESTRICT (Änderungen an Fremdschlüsseln in Fremdtabellen einschränken)
CASCADE (Fremdschlüsseländerungen folgen)
SET NULL
SET DEFAULT (Den Standardwert festlegen)
KEINE AKTION (keine Aktion, Standard)

CASCADE: Gibt an, dass beim Aktualisieren oder Löschen der übergeordneten Tabelle die entsprechenden Datensätze in der untergeordneten Tabelle aktualisiert oder gelöscht werden.
EINSCHRÄNKUNG und KEINE AKTION: Wenn die untergeordnete Tabelle verknüpfte Datensätze hat, kann die übergeordnete Tabelle nicht unabhängig davon gelöscht oder aktualisiert werden.
SET NULL: Gibt an, dass beim Aktualisieren oder Löschen der übergeordneten Tabelle die entsprechenden Felder der untergeordneten Tabelle auf NULL gesetzt werden.

4. Fallbeispiel

CASCADE-Einschränkungsmodus

1. Erstellen Sie die Power-Tabelle (übergeordnete Tabelle) Land
Tabelle Land erstellen (
id int ungleich null,
Name varchar(30),
Primärschlüssel (ID)
);

2. Datensätze einfügen, in Länderwerte einfügen (1, „Westeuropa“);
in Länderwerte einfügen (2, „Maya“);
in Länderwerte einfügen (3, „Sizilien“);

3. Erstellen Sie eine Waffentabelle (Untertabelle) und legen Sie Einschränkungen fest. Erstellen Sie die Tabelle „Soldat“ (
id int ungleich null,
Name varchar(30),
Länder-ID int,
Primärschlüssel (ID),
Der Fremdschlüssel (country_id) verweist auf country(id) bei Löschkaskade bei Aktualisierungskaskade,
);

4. Referenzintegritätstest, eingefügt in Soldatenwerte (1, „Westeuropäische Infanterie-Auszubildende“, 1);
#insert erfolgreich in Soldatenwerte eingefügt (2, „Maya-Kurzspeerkämpfer“, 2);
#insert erfolgreich in Solider-Werte eingefügt (3, „Sizilien – Normannische Ritter“, 3)
#erfolgreich einfügenin Solider-Werte einfügen (4, „Französischer Schwertkämpfer“, 4);
#Einfügen fehlgeschlagen, da in der Ländertabelle keine Fraktion mit der ID 4 vorhanden ist. 5. Test der Einschränkungsmethode „insert into solider values(4, 'Maya Tiger Warriors', 2);“
#Löschen aus Land mit ID=2 erfolgreich eingefügt;
#Dies führt dazu, dass die Datensätze mit den IDs 2 und 4 in der Soldatentabelle gleichzeitig gelöscht werden, da diese Fraktion in der übergeordneten Tabelle nicht mehr vorhanden ist und die entsprechenden Waffen daher natürlich verschwinden. Update Country Set ID=8, wobei ID=1 ist.
#Als Ergebnis werden alle Datensätze in der Soldatentabelle mit country_id 1 ebenfalls auf 8 geändert

Mit SET NULL-Einschränkung

1. Erstellen Sie eine Soldatentabelle (Untertabelle) und stellen Sie eine Einschränkungsbeziehung her, um die Tabelle zu löschen, falls ein Soldat vorhanden ist.
Tabelle erstellen Soldat(
id int ungleich null,
Name varchar(30),
Länder-ID int,
Primärschlüssel (ID),
Der Fremdschlüssel (country_id) verweist auf country(id), beim Löschen wird auf Null gesetzt, beim Aktualisieren wird auf Null gesetzt,
);

2. Referenzintegritätstest, eingefügt in Soldatenwerte (1, „Westeuropäische Infanterie-Auszubildende“, 1);
#insert erfolgreich in Soldatenwerte eingefügt (2, „Maya-Kurzspeerkämpfer“, 2);
#insert erfolgreich in Solider-Werte eingefügt (3, „Sizilien – Normannische Ritter“, 3)
#erfolgreich einfügenin Solider-Werte einfügen (4, „Französischer Schwertkämpfer“, 4);
#Einfügen fehlgeschlagen, da in der Ländertabelle keine Fraktion mit der ID 4 vorhanden ist. 3. Testen Sie die Einschränkungsmethode „Einfügen in Soldatenwerte“ (4, „Sizilianischer Bogenschütze“, 3);
#Löschen aus Land mit ID=3 erfolgreich eingefügt;
#Dies führt dazu, dass die Datensätze mit den IDs 3 und 4 in der Soldatentabelle auf NULL gesetzt werden
Ländersatz-ID aktualisieren=8, wobei ID=1 ist;
# Bewirkt, dass alle Datensätze in der Soldatentabelle, bei denen country_id 1 ist, auf NULL gesetzt werden

Im NO ACTION- oder RESTRICT-Modus (Standard)

1. Erstellen Sie eine Soldatentabelle (Untertabelle) und stellen Sie eine Einschränkungsbeziehung her, um die Tabelle zu löschen, falls ein Soldat vorhanden ist.
Tabelle erstellen Soldat(
id int ungleich null,
Name varchar(30),
Länder-ID int,
Primärschlüssel (ID),
Der Fremdschlüssel (country_id) verweist auf country(id) beim Löschen RESTRICT beim Aktualisieren RESTRICT,
);

2. Referenzintegritätstest, eingefügt in Soldatenwerte (1, „Westeuropäische Infanterie-Auszubildende“, 1);
#insert erfolgreich in Soldatenwerte eingefügt (2, „Maya-Kurzspeerkämpfer“, 2);
#insert erfolgreich in Solider-Werte eingefügt (3, „Sizilien – Normannische Ritter“, 3)
#erfolgreich einfügenin Solider-Werte einfügen (4, „Französischer Schwertkämpfer“, 4);
#Einfügen fehlgeschlagen, da in der Ländertabelle 3 keine Fraktion mit der ID 4 vorhanden ist. Test der Einschränkungsmethode „insert into solider values(4, 'Western European Knights', 1);“
#Löschen aus Land mit ID=1 erfolgreich eingefügt;
#Ein Fehler ist aufgetreten. In der untergeordneten Tabelle gibt es zugehörige Datensätze, daher können die entsprechenden Datensätze in der übergeordneten Tabelle nicht gelöscht werden. Das heißt, die Waffentabelle enthält auch Waffen, die zu Westeuropa gehören, daher können die westeuropäischen Streitkräfte in der übergeordneten Tabelle nicht einzeln gelöscht werden. Update Country Set ID=8, wobei ID=1;
#Fehler, es gibt zugehörige Datensätze in der untergeordneten Tabelle, daher kann die übergeordnete Tabelle nicht geändert werden

Oben finden Sie eine ausführliche Erläuterung der MySQL-Fremdschlüsseleinschränkungen. Weitere Informationen zu MySQL-Fremdschlüsseleinschränkungen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Spezielle Methode zum Hinzufügen von Fremdschlüsseleinschränkungen in MySQL
  • MySQL-Fremdschlüsseleinschränkung (FOREIGN KEY) Fallerklärung
  • Zusammenfassung der MySQL-Fremdschlüsseleinschränkungen und Tabellenbeziehungen
  • Beispielerklärung von MySQL-Fremdschlüsseleinschränkungen
  • Einführung in die MySQL-Methode zum Löschen von Tabellendaten mit Fremdschlüsseleinschränkungen
  • Einfache Implementierung zum Ignorieren von Fremdschlüsseleinschränkungen beim Löschen von MySQL-Tabellen
  • So deaktivieren Sie die Überprüfung auf Fremdschlüsseleinschränkungen in untergeordneten MySQL-Tabellen
  • So erstellen und löschen Sie Fremdschlüsseleinschränkungen in MySQL

<<:  Detailliertes Tutorial zur Installation von CUDA9.0 auf Ubuntu16.04

>>:  Detaillierte Erklärung der dynamischen Komponenten von vue.js

Artikel empfehlen

Detaillierte Erklärung dynamisch generierter Tabellen mit Javascript

*Seite erstellen: zwei Eingabefelder und ein Butt...

So konfigurieren Sie Eureka im Docker

Heureka: 1. Erstellen Sie ein JDK-Image Starten S...

So finden Sie Informationen zu nicht festgeschriebenen Transaktionen in MySQL

Vor einiger Zeit habe ich einen Blogbeitrag mit d...

Problem mit der Kompilierung des Nginx RTMP-Moduls in der Arm-Version

Inhaltsverzeichnis 1. Vorbereitung: 2. Quellcode-...

Vollständiger Prozessdatensatz zur Fehlerbehebung bei MySQL DeadLock

【Autor】 Liu Bo: Leitender Datenbankmanager im Ctr...

Zusammenfassung zur Anwendung dekorativer Elemente im Webdesign

<br />Vorwort: Bevor Sie dieses Tutorial les...

Beispiel für Sterne für den CSS-Bewertungseffekt

Was? Welcher Sternenmantel? Schauen wir uns zur V...

So verwenden Sie React zur Implementierung einer Bilderkennungs-App

Lassen Sie mich Ihnen zuerst das Effektbild zeige...

Docker Detaillierte Abbildungen

1. Einführung in Docker 1.1 Virtualisierung 1.1.1...

So aktivieren Sie TLS- und CA-Authentifizierung in Docker

Inhaltsverzeichnis 1. Zertifikat generieren 2. Ak...

Detaillierte Erklärung asynchroner Iteratoren in nodejs

Inhaltsverzeichnis Vorwort Was sind asynchrone It...