MySQL的外键约束
一、MySQL外鍵
外鍵表示一個(gè)表中的一個(gè)字段被另一個(gè)表中的一個(gè)字段引用。外鍵對(duì)相關(guān)表中的數(shù)據(jù)造成了限制,使MySQL的能夠保持參照完整性。只有InnoDB類型的表才可以使用外鍵。
1、外鍵的好處
可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作。
2、外鍵的作用
保持?jǐn)?shù)據(jù)一致性,完整性,主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù)。 使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值!
3、建立外鍵的前提
兩個(gè)表必須是InnoDB表類型。
使用在外鍵關(guān)系的域必須為索引型(Index)。
使用在外鍵關(guān)系的域必須與數(shù)據(jù)類型相似
4、創(chuàng)建的步驟
指定主鍵關(guān)鍵字: foreign key(列名)
引用外鍵關(guān)鍵字: references <外鍵表名>(外鍵列名)
5、事件觸發(fā)限制
on delete和on update , 可設(shè)參數(shù)cascade(跟隨外鍵改動(dòng)), restrict(限制外表中的外鍵改動(dòng)),set Null(設(shè)空值),set Default(設(shè)默認(rèn)值),[默認(rèn)]no action
二、創(chuàng)建外鍵
MySQL創(chuàng)建外鍵語法:
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action下面我們來更詳細(xì)的查看上面語法:
- 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í)行操作。如果省略O(shè)N 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í),可以省略O(shè)N 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ù)庫和兩個(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 CASCADEON DELETE RESTRICT )ENGINE=InnoDB;四、添加外鍵
1、MySQL添加外鍵語法
要將外鍵添加到現(xiàn)有表中,請(qǐng)使用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;2、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)使用以下語句:
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表。
五、刪除MySQL外鍵
您還可以使用ALTER TABLE語句將外鍵刪除,如下語句:
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語句,如下所示:
SHOW CREATE TABLE table_name;例如,要查看products表的外鍵,請(qǐng)使用以下語句:
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表有兩個(gè)外鍵約束: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禁用外鍵檢查
有時(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)使用以下語句:
當(dāng)然,可以使用以下語句啟用它:
SET foreign_key_checks = 1;七、注意
1、刪除帶有外鍵約束的表
創(chuàng)建department表:
創(chuàng)建course表:
create table course( course_id varchar(20), deptnames varchar(20), credits int, foreign key(deptnames) references department(dept_name));course表的外鍵deptnames指向department表的dept_name。若要?jiǎng)h除department,course這兩個(gè)表,則必須先刪除course表,再刪除department表。或者是把外鍵刪除掉后,兩張表的刪除順序就不分先后了。
總結(jié)
以上是生活随笔為你收集整理的MySQL的外键约束的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kylin修改默认hbase names
- 下一篇: linux cmake编译源码,linu