Heim  >  Artikel  >  Datenbank  >  Was ist ein Fremdschlüssel in MySQL?

Was ist ein Fremdschlüssel in MySQL?

青灯夜游
青灯夜游Original
2022-02-17 11:42:4522019Durchsuche

In MySQL handelt es sich bei einem Fremdschlüssel um eine oder mehrere Spalten, die zum Herstellen und Stärken der Verknüpfung zwischen Daten in zwei Tabellen verwendet werden. Dies bedeutet, dass ein Feld in einer Tabelle von einem Feld in einer anderen Tabelle referenziert wird. Fremdschlüssel schränken die Daten in zugehörigen Tabellen ein und ermöglichen MySQL, die referenzielle Integrität aufrechtzuerhalten.

Was ist ein Fremdschlüssel in MySQL?

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

Fremdschlüssel sind relativ zu Primärschlüsseln.

Primärschlüssel Ein Attribut oder eine Attributgruppe, die eine Zeile in der Tabelle eindeutig identifiziert. Eine Tabelle kann nur einen Primärschlüssel, aber mehrere Kandidatenindizes haben. Primärschlüssel bilden häufig mit Fremdschlüsseln referenzielle Integritätsbeschränkungen, um Dateninkonsistenzen zu verhindern. Der Primärschlüssel kann sicherstellen, dass der Datensatz eindeutig ist und das Primärschlüsselfeld nicht leer ist. Das Datenbankverwaltungssystem generiert automatisch einen eindeutigen Index für den Primärschlüssel, sodass der Primärschlüssel auch ein spezieller Index ist.

Ein Fremdschlüssel ist eine oder mehrere Spalten, die zum Herstellen und Stärken der Verknüpfung zwischen Daten in zwei Tabellen verwendet werden. Ein Fremdschlüssel bedeutet, dass ein Feld in einer Tabelle von einem Feld in einer anderen Tabelle referenziert wird. Fremdschlüssel schränken die Daten in zugehörigen Tabellen ein und ermöglichen MySQL, die referenzielle Integrität aufrechtzuerhalten.

Fremdschlüsseleinschränkungen werden hauptsächlich verwendet, um die Datenkonsistenz zwischen zwei Tabellen aufrechtzuerhalten. Kurz gesagt, der Fremdschlüssel einer Tabelle ist der Primärschlüssel einer anderen Tabelle, und der Fremdschlüssel verbindet die beiden Tabellen. Unter normalen Umständen müssen Sie zum Löschen des Primärschlüssels in einer Tabelle zunächst sicherstellen, dass in anderen Tabellen keine identischen Fremdschlüssel vorhanden sind (d. h. dem Primärschlüssel in der Tabelle ist kein Fremdschlüssel zugeordnet).

Bei der Definition von Fremdschlüsseln müssen Sie folgende 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.

  • 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.

Fremdschlüssel erstellen

MySQL-Syntax zum Erstellen eines Fremdschlüssels

Die folgende Syntax veranschaulicht, wie ein Fremdschlüssel in einer Untertabelle in einer CREATE TABLE-Anweisung definiert wird. CREATE TABLE语句中的子表中定义外键。

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

下面我们来更详细的查看上面语法:

  • CONSTRAINT子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。
  • FOREIGN KEY子句指定子表中引用父表中主键列的列。您可以在FOREIGN KEY子句后放置一个外键名称,或者让MySQL为您创建一个名称。 请注意,MySQL会自动创建一个具有foreign_key_name名称的索引。
  • REFERENCES子句指定父表及其子表中列的引用。 在FOREIGN KEYREFERENCES中指定的子表和父表中的列数必须相同。
  • ON DELETE子句允许定义当父表中的记录被删除时,子表的记录怎样执行操作。如果省略ON DELETE子句并删除父表中的记录,则MySQL将拒绝删除子表中相关联的数据。此外,MySQL还提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE,当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录。 如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL操作。当父表中的记录被删除时,MySQL会将子表中的外键列值设置为NULL,条件是子表中的外键列必须接受NULL值。 请注意,如果使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL将拒绝删除。
  • ON UPDATE子句允许指定在父表中的行更新时,子表中的行会怎样执行操作。当父表中的行被更新时,可以省略ON UPDATE子句让MySQL拒绝对子表中的行的任何更新。 ON UPDATE CASCADE操作允许您执行交叉表更新,并且当更新父表中的行时,ON UPDATE SET NULL操作会将子表中行中的值重置为NULL值。 ON UPDATE NO ACTIONUPDATE 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;
  • Sehen wir uns die obige Syntax genauer an:

    Mit der CONSTRAINT-Klausel können Sie Einschränkungsnamen für Fremdschlüsseleinschränkungen definieren. Wenn Sie es weglassen, generiert MySQL automatisch einen Namen. Die 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 einen Fremdschlüsselnamen nach der FOREIGN KEY-Klausel einfügen oder MySQL einen für Sie erstellen lassen. Beachten Sie, dass MySQL automatisch einen Index mit dem Namen foreign_key_name erstellt.

    🎜Die REFERENCES-Klausel gibt Verweise auf Spalten in der übergeordneten Tabelle und ihren untergeordneten Tabellen an. Die Anzahl der Spalten in den untergeordneten und übergeordneten Tabellen, die in FOREIGN KEY und REFERENCES angegeben sind, muss gleich sein. 🎜🎜Mit der ON DELETE-Klausel können Sie definieren, wie Datensätze in der untergeordneten Tabelle Vorgänge ausführen, 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, weigert sich MySQL, die zugehörigen Daten in der untergeordneten Tabelle zu löschen. Darüber hinaus bietet MySQL auch einige Vorgänge, mit denen Sie zusätzliche Optionen verwenden können, z. B. „ON DELETE CASCADE“: Beim Löschen von Datensätzen in der übergeordneten Tabelle kann MySQL Datensätze in der untergeordneten Tabelle löschen, die auf Datensätze in der übergeordneten Tabelle verweisen. Wenn Sie keine zugehörigen Datensätze in der untergeordneten Tabelle löschen möchten, verwenden Sie stattdessen die Operation ON DELETE SET NULL. Wenn ein Datensatz in der übergeordneten Tabelle gelöscht wird, setzt MySQL den Fremdschlüsselspaltenwert in der untergeordneten Tabelle auf NULL, vorausgesetzt, dass die Fremdschlüsselspalte in der untergeordneten Tabelle NULL akzeptieren muss. Code> >Wert. Bitte beachten Sie, dass MySQL den Löschvorgang ablehnt, wenn die Operation <code>ON DELETE NO ACTION oder ON DELETE RESTRICT verwendet wird. 🎜🎜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 alle Aktualisierungen von Zeilen in der untergeordneten Tabelle ablehnt, wenn Zeilen in der übergeordneten Tabelle aktualisiert werden. Mit der Operation ON UPDATE CASCADE können Sie eine Kreuztabellenaktualisierung durchführen. Wenn eine Zeile in der übergeordneten Tabelle aktualisiert wird, setzt die Operation ON UPDATE SET NULL den Wert in der Zeile zurück in der untergeordneten Tabelle ist ein NULL-Wert. Die Aktion ON UPDATE NO ACTION oder UPDATE RESTRICT lehnt jede Aktualisierung ab. 🎜🎜🎜🎜MySQL-Beispiel für die Erstellung eines Tabellenfremdschlüssels🎜🎜

    以下示例创建一个dbdemo数据库和两个表:categoriesproducts。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有UPDATE ON CASCADEDELETE 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_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;

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

    删除MySQL外键

    您还可以使用ALTER TABLE语句将外键删除,如下语句:

    ALTER TABLE table_name 
    DROP FOREIGN KEY constraint_name;

    在上面的声明中:

    • 首先,指定要从中删除外键的表名称。
    • 其次,将约束名称放在DROP FOREIGN KEY子句之后。

    请注意,constraint_name是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。

    要获取生成的表的约束名称,请使用SHOW CREATE TABLE语句,如下所示:

    SHOW CREATE TABLE table_name;

    例如,要查看products表的外键,请使用以下语句:

    SHOW CREATE TABLE products;

    以下是语句的输出:

    CREATE TABLE products (
      prd_id int(11) NOT NULL AUTO_INCREMENT,
      prd_name varchar(355) NOT NULL,
      prd_price decimal(10,0) DEFAULT NULL,
      cat_id int(11) NOT NULL,
      vdr_id int(11) NOT NULL,
      PRIMARY KEY (prd_id),
      KEY fk_cat (cat_id),
      KEY fk_vendor(vdr_id),
    
      CONSTRAINT products_ibfk_2 
      FOREIGN KEY (vdr_id) 
      REFERENCES vendors (vdr_id) 
      ON DELETE NO ACTION 
      ON UPDATE CASCADE,
    
      CONSTRAINT products_ibfk_1 
      FOREIGN KEY (cat_id) 
      REFERENCES categories (cat_id) 
      ON UPDATE CASCADE
    ) ENGINE=InnoDB;

    products表有两个外键约束:products_ibfk_1products_ibfk_2

    可以使用以下语句删除products表的外键:

    ALTER TABLE products 
    DROP FOREIGN KEY products_ibfk_1;
    
    ALTER TABLE products 
    DROP FOREIGN KEY products_ibfk_2;

    MySQL禁用外键检查

    有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。

    除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。

    要禁用外键检查,请使用以下语句:

    SET foreign_key_checks = 0;

    当然,可以使用以下语句启用它:

    SET foreign_key_checks = 1;

    【相关推荐:mysql视频教程

Das obige ist der detaillierte Inhalt vonWas ist ein Fremdschlüssel in MySQL?. 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