mysql中什么是外鍵

mysql中,外鍵是用于建立和加強兩個表數據之間的鏈接的一列或多列,它表示一個表中的一個字段被另一個表中的一個字段引用。外鍵對相關表中的數據造成了限制,使MySQL能夠保持參照完整性。

mysql中什么是外鍵

本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。

外鍵是相對主鍵而來的。

主鍵(primary key) 能夠唯一標識表中某一行的屬性或屬性組。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常常與外鍵構成參照完整性約束,防止出現數據不一致。主鍵可以保證記錄的唯一和主鍵域非空,數據庫管理系統對于主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。

外鍵(foreign key) 是用于建立和加強兩個表數據之間的鏈接的一列或多列。外鍵表示一個表中的一個字段被另一個表中的一個字段引用。外鍵對相關表中的數據造成了限制,使MySQL能夠保持參照完整性。

外鍵約束主要用來維護兩個表之間數據的一致性。簡言之,表的外鍵就是另一表的主鍵,外鍵將兩表聯系起來。一般情況下,要刪除一張表中的主鍵必須首先要確保其它表中的沒有相同外鍵(即該表中的主鍵沒有一個外鍵和它相關聯)。

定義外鍵時,需要遵守下列規則:

  • 主表必須已經存在于數據庫中,或者是當前正在創建的表。如果是后一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。

  • 必須為主表定義主鍵。

  • 主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。

  • 在主表的表名后面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。

  • 外鍵中列的數目必須和主表的主鍵中列的數目相同。

  • 外鍵中列的數據類型必須和主表主鍵中對應列的數據類型相同。

創建外鍵

MySQL創建外鍵語法

以下語法說明了如何在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 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_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_1和products_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視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享