本篇內(nèi)容主要講解“MySQL中的外鍵有什么用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“mysql中的外鍵有什么用”吧!
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)寬城免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
在mysql中,外鍵是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的鏈接的一列或多列,它表示一個(gè)表中的一個(gè)字段被另一個(gè)表中的一個(gè)字段引用。外鍵對(duì)相關(guān)表中的數(shù)據(jù)造成了限制,使MySQL能夠保持參照完整性。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
外鍵是相對(duì)主鍵而來(lái)的。
主鍵(primary key)能夠唯一標(biāo)識(shí)表中某一行的屬性或?qū)傩越M。一個(gè)表只能有一個(gè)主鍵,但可以有多個(gè)候選索引。主鍵常常與外鍵構(gòu)成參照完整性約束,防止出現(xiàn)數(shù)據(jù)不一致。主鍵可以保證記錄的唯一和主鍵域非空,數(shù)據(jù)庫(kù)管理系統(tǒng)對(duì)于主鍵自動(dòng)生成唯一索引,所以主鍵也是一個(gè)特殊的索引。
外鍵(foreign key)是用于建立和加強(qiáng)兩個(gè)表數(shù)據(jù)之間的鏈接的一列或多列。外鍵表示一個(gè)表中的一個(gè)字段被另一個(gè)表中的一個(gè)字段引用。外鍵對(duì)相關(guān)表中的數(shù)據(jù)造成了限制,使MySQL能夠保持參照完整性。
外鍵約束主要用來(lái)維護(hù)兩個(gè)表之間數(shù)據(jù)的一致性。簡(jiǎn)言之,表的外鍵就是另一表的主鍵,外鍵將兩表聯(lián)系起來(lái)。一般情況下,要?jiǎng)h除一張表中的主鍵必須首先要確保其它表中的沒有相同外鍵(即該表中的主鍵沒有一個(gè)外鍵和它相關(guān)聯(lián))。
定義外鍵時(shí),需要遵守下列規(guī)則:
主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個(gè)表,這樣的表稱為自參照表,這種結(jié)構(gòu)稱為自參照完整性。
必須為主表定義主鍵。
主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說(shuō),只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這個(gè)外鍵的內(nèi)容就是正確的。
在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。
外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類型相同。
MySQL創(chuàng)建外鍵語(yǔ)法
以下語(yǔ)法說(shuō)明了如何在CREATE TABLE
語(yǔ)句中的子表中定義外鍵。
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action
下面我們來(lái)更詳細(xì)的查看上面語(yǔ)法:
CONSTRAINT
子句允許您為外鍵約束定義約束名稱。如果省略它,MySQL將自動(dòng)生成一個(gè)名稱。
FOREIGN KEY
子句指定子表中引用父表中主鍵列的列。您可以在FOREIGN KEY
子句后放置一個(gè)外鍵名稱,或者讓MySQL為您創(chuàng)建一個(gè)名稱。 請(qǐng)注意,MySQL會(huì)自動(dòng)創(chuàng)建一個(gè)具有foreign_key_name
名稱的索引。
REFERENCES
子句指定父表及其子表中列的引用。 在FOREIGN KEY
和REFERENCES
中指定的子表和父表中的列數(shù)必須相同。
ON DELETE
子句允許定義當(dāng)父表中的記錄被刪除時(shí),子表的記錄怎樣執(zhí)行操作。如果省略ON DELETE
子句并刪除父表中的記錄,則MySQL將拒絕刪除子表中相關(guān)聯(lián)的數(shù)據(jù)。此外,MySQL還提供了一些操作,以便您可以使用其他選項(xiàng),例如ON DELETE CASCADE,當(dāng)刪除父表中的記錄時(shí),MySQL可以刪除子表中引用父表中記錄的記錄。 如果您不希望刪除子表中的相關(guān)記錄,請(qǐng)改用ON DELETE SET NULL
操作。當(dāng)父表中的記錄被刪除時(shí),MySQL會(huì)將子表中的外鍵列值設(shè)置為NULL
,條件是子表中的外鍵列必須接受NULL
值。 請(qǐng)注意,如果使用ON DELETE NO ACTION
或ON DELETE RESTRICT
操作,MySQL將拒絕刪除。
ON UPDATE
子句允許指定在父表中的行更新時(shí),子表中的行會(huì)怎樣執(zhí)行操作。當(dāng)父表中的行被更新時(shí),可以省略ON UPDATE
子句讓MySQL拒絕對(duì)子表中的行的任何更新。 ON UPDATE CASCADE
操作允許您執(zhí)行交叉表更新,并且當(dāng)更新父表中的行時(shí),ON UPDATE SET NULL
操作會(huì)將子表中行中的值重置為NULL
值。 ON UPDATE NO ACTION
或UPDATE RESTRICT
操作拒絕任何更新。
MySQL創(chuàng)建表外鍵示例
以下示例創(chuàng)建一個(gè)dbdemo
數(shù)據(jù)庫(kù)和兩個(gè)表:categories
和products
。每個(gè)類別都有一個(gè)或多個(gè)產(chǎn)品,每個(gè)產(chǎn)品只屬于一個(gè)類別。 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添加外鍵語(yǔ)法
要將外鍵添加到現(xiàn)有表中,請(qǐng)使用ALTER TABLE
語(yǔ)句與上述外鍵定義語(yǔ)法:
ALTER table_name ADD CONSTRAINT constraint_name FOREIGN KEY foreign_key_name(columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action;
MySQL添加外鍵示例
現(xiàn)在,我們添加一個(gè)名為vendors
的新表,并更改products
表以包含供應(yīng)商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
表中添加外鍵,請(qǐng)使用以下語(yǔ)句:
ALTER TABLE products ADD FOREIGN KEY fk_vendor(vdr_id) REFERENCES vendors(vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE;
現(xiàn)在,products
表有兩個(gè)外鍵,一個(gè)是引用categories
表,另一個(gè)是引用vendors
表。
您還可以使用ALTER TABLE
語(yǔ)句將外鍵刪除,如下語(yǔ)句:
ALTER TABLE table_name DROP FOREIGN KEY constraint_name;
在上面的聲明中:
首先,指定要從中刪除外鍵的表名稱。
其次,將約束名稱放在DROP FOREIGN KEY
子句之后。
請(qǐng)注意,
constraint_name
是在創(chuàng)建或添加外鍵到表時(shí)指定的約束的名稱。 如果省略它,MySQL會(huì)為您生成約束名稱。
要獲取生成的表的約束名稱,請(qǐng)使用SHOW CREATE TABLE
語(yǔ)句,如下所示:
SHOW CREATE TABLE table_name;
例如,要查看products
表的外鍵,請(qǐng)使用以下語(yǔ)句:
SHOW CREATE TABLE products;
以下是語(yǔ)句的輸出:
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
表有兩個(gè)外鍵約束:products_ibfk_1
和products_ibfk_2
。
可以使用以下語(yǔ)句刪除products
表的外鍵:
ALTER TABLE products DROP FOREIGN KEY products_ibfk_1; ALTER TABLE products DROP FOREIGN KEY products_ibfk_2;
有時(shí),因?yàn)槟撤N原因需要禁用外鍵檢查(例如將CSV文件中的數(shù)據(jù)導(dǎo)入表中)非常有用。 如果不禁用外鍵檢查,則必須以正確的順序加載數(shù)據(jù),即必須首先將數(shù)據(jù)加載到父表中,然后再將數(shù)據(jù)加載導(dǎo)入到子表中,這可能是乏味的。 但是,如果禁用外鍵檢查,則可以按任何順序加載導(dǎo)入數(shù)據(jù)。
除非禁用外鍵檢查,否則不能刪除由外鍵約束引用的表。刪除表時(shí),還會(huì)刪除為表定義的任何約束。
要禁用外鍵檢查,請(qǐng)使用以下語(yǔ)句:
SET foreign_key_checks = 0;
當(dāng)然,可以使用以下語(yǔ)句啟用它:
SET foreign_key_checks = 1;
到此,相信大家對(duì)“mysql中的外鍵有什么用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章題目:mysql中的外鍵有什么用
文章路徑:http://chinadenli.net/article48/giichp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、網(wǎng)站排名、自適應(yīng)網(wǎng)站、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)