在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
表。
您還可以使用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;
有時,因為某種原因需要禁用外來鍵檢查(例如將CSV檔案中的資料匯入表中)非常有用。 如果不禁用外來鍵檢查,則必須以正確的順序載入資料,即必須首先將資料載入到父表中,然後再將資料載入匯入到子表中,這可能是乏味的。 但是,如果禁用外來鍵檢查,則可以按任何順序載入匯入資料。
除非禁用外來鍵檢查,否則不能刪除由外來鍵約束參照的表。刪除表時,還會刪除為表定義的任何約束。
要禁用外來鍵檢查,請使用以下語句:
SET foreign_key_checks = 0;
當然,可以使用以下語句啟用它:
SET foreign_key_checks = 1;
【相關推薦:】
以上就是mysql中什麼是外來鍵的詳細內容,更多請關注TW511.COM其它相關文章!