您好,登錄后才能下訂單哦!
本篇內容主要講解“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
表。
您還可以使用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中的外鍵有什么用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。