Heim  >  Artikel  >  Hat MySQL Fremdschlüssel?

Hat MySQL Fremdschlüssel?

百草
百草Original
2023-06-13 13:29:501598Durchsuche

MySQL verfügt über Fremdschlüssel, die hauptsächlich zum Herstellen der Beziehung zwischen der Master-Tabelle und der Slave-Tabelle verwendet werden. Sie können eine Verbindung für die Daten der beiden Tabellen herstellen und die Konsistenz und Integrität der Daten in den beiden Tabellen einschränken. Wenn ein Datensatz aus der Haupttabelle gelöscht wird, muss auch der entsprechende Datensatz aus der Slave-Tabelle entsprechend geändert werden. Eine Tabelle kann einen oder mehrere Fremdschlüssel haben. 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 sowie der Anzahl und dem entsprechenden Datentyp der Spalten in entsprechen Der Fremdschlüssel muss derselbe sein wie der Primärschlüssel der Haupttabelle.

Hat MySQL Fremdschlüssel?

Das Betriebssystem dieses Tutorials: Windows 10-System, MySQL-Version 8.0, Dell G3-Computer.

MySQL hat 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.

Hat MySQL 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 festgelegt 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“:

Hat MySQL 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.

Bei der Definition von Fremdschlüsseln in MySQL müssen Sie die folgenden Regeln beachten:

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.

Der Primärschlüssel muss für die Haupttabelle definiert werden.

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 Primärtabelle 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.

Fremdschlüssel für Tabelle erstellen

MySQL-Syntax zum Erstellen von Fremdschlüsseln

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

Lass uns die Syntax genauer lernen:

CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。

FOREIGN KEY子句指定子表中引用父表中主键列的列。你可以把一个外键名称放在FOREIGN KEY子句之后,或者让MySQL为你创建一个名字。请注意,MySQL会自动使用foreign_key_name名称创建索引。

REFERENCES子句指定子表中的列所引用的父表及列。在规定的子表和父表的列数FOREIGN KEY和REFERENCES必须相同。

ON DELETE子句允许您定义删除父表中的记录时子表中记录的内容。如果省略ON DELETE子句并删除父表中包含子表中记录的记录,MySQL将拒绝删除。此外,MySQL还为您提供操作,以便您可以使用其他选项,例如ON DELETE CASCADE ,要求MySQL删除子表中的记录,当父表中的记录被删除时,记录将引用父表中的记录。如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。MySQL会将子表中的外键列值设置为NULL删除父表中的记录时,条件是子表中的外键列必须接受NULL值。请注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL将拒绝删除。

ON UPDATE子句使您可以指定更新父表中的行时子表中的行会发生什么。您可以省略ON UPDATE子句,以便在更新父表中的行时让MySQL拒绝对子表中行的任何更新。ON UPDATE CASCADE操作允许您执行跨表更新,并且当更新父表ON UPDATE SET NULL中的行时,操作会将子表中的行中的值重置为值NULL。ON UPDATE NO ACTION或UPDATE RESTRICT行动拒绝任何更新。

MySQL创建表外键示例

下面的示例创建一个dbdemo数据库和两个表:categories和 products.每个类别具有一个或多个产品和每个产品只属于一个类别。products表中的cat_id字段被定义为带有UPDATE ON CASCADE和DELETE ON RESTRICT操作的外键。

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;

将外键添加到表中

MySQL添加外键语法

要将外键添加到现有表,请使用带有上述外键定义语法的ALTER TABLE语句:

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添加外键示例

现在,让我们添加一个名为vendors的新表,并更改products表以包含供应商ID字段:

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;

要向表中添加外键products,请使用以下语句: 

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

Hat MySQL Fremdschlüssel?

 现在,products表有两个外键,一个引用categories表,另一个引用vendors表。

Das obige ist der detaillierte Inhalt vonHat MySQL 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