Heim  >  Artikel  >  Datenbank  >  MySQL unterstützt keine Fremdschlüssel

MySQL unterstützt keine Fremdschlüssel

青灯夜游
青灯夜游Original
2022-06-27 12:00:072152Durchsuche

MySQL unterstützt Fremdschlüssel. In MySQL werden Fremdschlüssel hauptsächlich verwendet, um die Beziehung zwischen der Master-Tabelle und der Slave-Tabelle herzustellen. Sie können eine Verbindung für die Daten in den beiden Tabellen herstellen und die Konsistenz und Integrität der Daten in den beiden Tabellen einschränken Tabelle löscht einen Datensatz. Der entsprechende Datensatz aus der Tabelle muss ebenfalls entsprechend geändert werden. Eine Tabelle kann einen oder mehrere Fremdschlüssel haben, und der Fremdschlüssel kann ein Nullwert sein. Wenn es sich nicht um einen Nullwert handelt, muss der Wert jedes Fremdschlüssels einem bestimmten Wert des Primärschlüssels in der Haupttabelle entsprechen. und die Anzahl der Spalten im Fremdschlüssel und Der entsprechende Datentyp muss mit dem Primärschlüssel der Haupttabelle identisch sein.

MySQL unterstützt keine Fremdschlüssel

Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.

MySQL unterstützt Fremdschlüssel.

MySQL FOREIGN KEY (FOREIGN KEY)

Ein Fremdschlüssel ist ein Feld in einer angegebenen Tabelle, das mit einem anderen Feld in einer anderen Tabelle übereinstimmt. Fremdschlüssel erlegen Einschränkungen für Daten in zugehörigen Tabellen auf, wodurch MySQL die referenzielle Integrität aufrechterhalten kann.

Fremdschlüssel werden verwendet, um die Beziehung zwischen der Master-Tabelle und der Slave-Tabelle herzustellen, eine Verbindung für die Daten in den beiden Tabellen herzustellen und die Konsistenz und Integrität der Daten in den beiden Tabellen einzuschränken.

Bei zwei Tabellen mit einer zugehörigen Beziehung ist die Tabelle, in der sich der Primärschlüssel im zugehörigen Feld befindet, die Haupttabelle (übergeordnete Tabelle) und die Tabelle, in der sich der Fremdschlüssel befindet, die sekundäre Tabelle (untergeordnete Tabelle).

Wenn ein Datensatz aus der Haupttabelle gelöscht wird, muss auch der entsprechende Datensatz aus der Tabelle entsprechend geändert werden. Eine Tabelle kann einen oder mehrere Fremdschlüssel haben, und der Fremdschlüssel kann null sein. Wenn er nicht null ist, muss der Wert jedes Fremdschlüssels einem bestimmten Wert des Primärschlüssels in der Haupttabelle entsprechen.

Werfen wir einen Blick auf das folgende Datenbankdiagramm aus der Beispieldatenbank.

MySQL unterstützt keine Fremdschlüssel

Wir haben zwei Tabellen: Kunden und Bestellungen. Jeder Kunde hat null oder mehr Bestellungen und jede Bestellung kann nur einem Kunden gehören. Die Beziehung zwischen der Tabelle „customers“ und der Tabelle „orders“ ist eine Eins-zu-viele-Beziehung, wobei Bestellungen durch den Fremdschlüssel in der durch das Feld „customerNumber“ angegebenen Tabelle erstellt werden. Das Feld „customerNumber“ in der Tabelle „customers“ ist mit dem Primärschlüsselfeld „customerNumber“ in der Tabelle „orders“ verknüpft.

Die Kundentabelle wird als übergeordnete Tabelle oder Referenztabelle bezeichnet, und die Bestelltabelle wird als untergeordnete Tabelle oder Referenztabelle bezeichnet.

Fremdschlüssel kann eine Spalte oder eine Reihe von Spalten sein. Spalten in der untergeordneten Tabelle verweisen normalerweise auf Primärschlüsselspalten in der übergeordneten Tabelle.

Tabellen können mehrere Fremdschlüssel haben und jeder Fremdschlüssel in einer untergeordneten Tabelle kann auf eine andere übergeordnete Tabelle verweisen.

Die Zeilen in der untergeordneten Tabelle müssen Werte enthalten, die in der übergeordneten Tabelle vorhanden sind. Beispielsweise muss jeder Bestelldatensatz in der Bestelltabelle einen Wert haben, der in der Kundentabelle customerNumber vorhanden ist. Daher können sich mehrere Bestellungen auf denselben Kunden beziehen, und diese Beziehung wird Eins (Kunde) zu vielen (Bestellungen) oder Eins-zu-Viele (Eins-zu-Viele) genannt.

Manchmal sind die untergeordnete Tabelle und die übergeordnete Tabelle identisch. Der Fremdschlüssel bezieht sich auf den Primärschlüssel der Tabelle, zum Beispiel unter der Tabelle „Mitarbeiter“:

MySQL unterstützt keine Fremdschlüssel

Die Spalte „reportTo“ ist ein Fremdschlüssel, der sich auf „employeeNumber“ als Spalte des Primärschlüssels der Tabelle „Mitarbeiter“ bezieht, die wiedergegeben werden soll die Berichtsstruktur zwischen Mitarbeitern, d. h. jeder Mitarbeiter berichtet an einen anderen Mitarbeiter. Ein Mitarbeiter kann null oder mehr direkt unterstellte Mitarbeiter haben. Wir haben ein Tutorial zu Selbstverknüpfungen, das Ihnen beim Abfragen von Daten anhand solcher Tabellen helfen kann. Der

reportTo-Fremdschlüssel wird auch als rekursiver oder selbstreferenzieller Fremdschlüssel bezeichnet.

Fremdschlüssel erzwingen die referenzielle Integrität und helfen Ihnen, die Konsistenz und Integrität Ihrer Daten automatisch aufrechtzuerhalten. Sie können beispielsweise keine Bestellung für einen Kunden erstellen, der nicht existiert.

Darüber hinaus können Sie eine Kaskade für den Löschvorgang des Fremdschlüssels customerNumber einrichten, sodass beim Löschen eines Kunden in der Kundentabelle auch alle mit dem Kunden verknüpften Bestellungen gelöscht werden. Dies spart Zeit und Aufwand durch die Verwendung mehrerer DELETE-Anweisungen oder DELETE JOIN-Anweisungen.

Wie beim Löschen können Sie auch eine Kaskade für den Fremdschlüssel „customerNumber“ für den Aktualisierungsvorgang definieren, um tabellenübergreifende Aktualisierungen durchzuführen, ohne mehrere UPDATE-Anweisungen oder UPDATE JOIN-Anweisungen zu verwenden.

Hinweis: In MySQL unterstützt die InnoDB-Speicher-Engine Fremdschlüssel, daher müssen Sie eine InnoDB-Tabelle erstellen, um Fremdschlüsseleinschränkungen zu verwenden.

MySQL muss bei der Definition von Fremdschlüsseln die folgenden Regeln einhalten:

  • Die Haupttabelle muss bereits in der Datenbank vorhanden sein oder die Tabelle sein, die gerade erstellt wird. Im letzteren Fall handelt es sich bei der Master-Tabelle und der Slave-Tabelle um dieselbe Tabelle. Eine solche Tabelle wird als selbstreferenzielle Tabelle bezeichnet, und diese Struktur wird als selbstreferenzielle Integrität bezeichnet.

  • Muss einen Primärschlüssel für die Haupttabelle definieren.

  • Primärschlüssel dürfen keine Nullwerte enthalten, in Fremdschlüsseln sind jedoch Nullwerte zulässig. Das heißt, solange jeder Nicht-Null-Wert des Fremdschlüssels im angegebenen Primärschlüssel vorkommt, ist der Inhalt des Fremdschlüssels korrekt.

  • Geben Sie den Spaltennamen oder eine Kombination von Spaltennamen nach dem Tabellennamen der Haupttabelle an. Diese Spalte oder Spaltenkombination muss der Primärschlüssel oder Kandidatenschlüssel der Haupttabelle sein.

  • Die Anzahl der Spalten im Fremdschlüssel muss mit der Anzahl der Spalten im Primärschlüssel der Haupttabelle übereinstimmen.

  • Der Datentyp der Spalte im Fremdschlüssel muss mit dem Datentyp der entsprechenden Spalte im Primärschlüssel der Haupttabelle übereinstimmen.

Erstellen eines Fremdschlüssels für eine Tabelle

MySQL-Syntax zum Erstellen eines Fremdschlüssels

Die folgende Syntax erklärt, wie man einen Fremdschlüssel in einer untergeordneten Tabelle in einer CREATE TABLE-Anweisung definiert.

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

Lernen wir die Syntax genauer:

  • Mit der CONSTRAINT-Klausel können Sie Einschränkungsnamen für Fremdschlüsseleinschränkungen definieren. Wenn Sie es weglassen, generiert MySQL automatisch einen Namen.

  • FOREIGN KEY-Klausel gibt die Spalten in der untergeordneten Tabelle an, die auf die Primärschlüsselspalten in der übergeordneten Tabelle verweisen. Sie können nach der FOREIGN KEY-Klausel einen Fremdschlüsselnamen einfügen oder MySQL einen Namen für Sie erstellen lassen. Beachten Sie, dass MySQL den Index automatisch unter Verwendung des Namens „foreign_key_name“ erstellt.

  • Die REFERENCES-Klausel gibt die übergeordnete Tabelle und die Spalten an, auf die die Spalten in der untergeordneten Tabelle verweisen. Die Anzahl der Spalten in der angegebenen untergeordneten Tabelle und der übergeordneten Tabelle FOREIGN KEY und REFERENCES muss gleich sein. Mit der ON DELETE-Klausel können Sie definieren, was in der untergeordneten Tabelle aufgezeichnet wird, wenn Datensätze in der übergeordneten Tabelle gelöscht werden. Wenn Sie die ON DELETE-Klausel weglassen und Datensätze in der übergeordneten Tabelle löschen, die Datensätze in der untergeordneten Tabelle enthalten, verweigert MySQL das Löschen. Darüber hinaus stellt Ihnen MySQL auch Aktionen zur Verfügung, mit denen Sie zusätzliche Optionen wie ON DELETE CASCADE verwenden können, wodurch MySQL aufgefordert wird, Datensätze in der untergeordneten Tabelle zu löschen. Wenn ein Datensatz in der übergeordneten Tabelle gelöscht wird, verweist der Datensatz auf den Datensatz in die übergeordnete Tabelle. Wenn Sie keine zugehörigen Datensätze in der untergeordneten Tabelle löschen möchten, verwenden Sie stattdessen die Operation ON DELETE SET NULL. MySQL setzt den Fremdschlüsselspaltenwert in der untergeordneten Tabelle auf NULL, wenn Datensätze in der übergeordneten Tabelle gelöscht werden. Die Bedingung ist, dass die Fremdschlüsselspalte in der untergeordneten Tabelle NULL-Werte akzeptieren muss. Beachten Sie, dass MySQL den Löschvorgang ablehnt, wenn Sie die Operation ON DELETE NO ACTION oder ON DELETE RESTRICT verwenden.

  • Mit der ON UPDATE-Klausel können Sie angeben, was mit Zeilen in der untergeordneten Tabelle passiert, wenn Zeilen in der übergeordneten Tabelle aktualisiert werden. Sie können die ON UPDATE-Klausel weglassen, damit MySQL beim Aktualisieren von Zeilen in der übergeordneten Tabelle alle Aktualisierungen von Zeilen in der untergeordneten Tabelle ablehnt. Mit der ON UPDATE CASCADE-Operation können Sie tabellenübergreifende Aktualisierungen durchführen. Wenn eine Zeile in der übergeordneten Tabelle mit ON UPDATE SET NULL aktualisiert wird, setzt die Operation den Wert in der Zeile in der untergeordneten Tabelle auf den Wert NULL zurück. Mit der Aktion „ON UPDATE NO ACTION“ oder „UPDATE RESTRICT“ können Sie Aktualisierungen ablehnen.

  • MySQL-Beispiel zum Erstellen einer Tabelle mit Fremdschlüsseln

Das folgende Beispiel erstellt eine dbdemo-Datenbank und zwei Tabellen: Kategorien und Produkte. Jede Kategorie hat ein oder mehrere Produkte und jedes Produkt gehört nur zu einer Kategorie. Das Feld cat_id in der Produkttabelle wird mit den Operationen UPDATE ON CASCADE und DELETE ON RESTRICT als Fremdschlüssel definiert.

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

Fremdschlüssel zur Tabelle hinzufügen

MySQL fügt Fremdschlüsselsyntax hinzu

Um einen Fremdschlüssel zu einer vorhandenen Tabelle hinzuzufügen, verwenden Sie die ALTER TABLE-Anweisung mit der oben genannten Fremdschlüsseldefinitionssyntax:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;

MySQL-Beispiel „Fremdschlüssel hinzufügen“

Jetzt fügen wir eine neue Tabelle mit dem Namen „vendors“ hinzu und ändern die Produkttabelle so, dass sie das Feld „Vendor ID“ enthält:

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;
Um die Fremdschlüsselprodukte zur Tabelle hinzuzufügen, verwenden Sie die folgende Anweisung:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

Jetzt verfügt die Produkttabelle über zwei Fremdschlüssel, einer bezieht sich auf die Kategorientabelle und der andere auf die Lieferantentabelle.

【Verwandte Empfehlung:

MySQL-Video-TutorialMySQL unterstützt keine Fremdschlüssel

Das obige ist der detaillierte Inhalt vonMySQL unterstützt keine Fremdschlüssel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was ist mysql.sock?Nächster Artikel:Was ist mysql.sock?