MySQL的外键约束
一、MySQL外鍵
外鍵表示一個表中的一個字段被另一個表中的一個字段引用。外鍵對相關表中的數據造成了限制,使MySQL的能夠保持參照完整性。只有InnoDB類型的表才可以使用外鍵。
1、外鍵的好處
可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。
2、外鍵的作用
保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據。 使兩張表形成關聯,外鍵只能引用外表中的列的值!
3、建立外鍵的前提
兩個表必須是InnoDB表類型。
使用在外鍵關系的域必須為索引型(Index)。
使用在外鍵關系的域必須與數據類型相似
4、創建的步驟
指定主鍵關鍵字: foreign key(列名)
引用外鍵關鍵字: references <外鍵表名>(外鍵列名)
5、事件觸發限制
on delete和on update , 可設參數cascade(跟隨外鍵改動), restrict(限制外表中的外鍵改動),set Null(設空值),set Default(設默認值),[默認]no action
二、創建外鍵
MySQL創建外鍵語法:
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 CASCADEON DELETE RESTRICT )ENGINE=InnoDB;四、添加外鍵
1、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;2、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 = 1;七、注意
1、刪除帶有外鍵約束的表
創建department表:
創建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。若要刪除department,course這兩個表,則必須先刪除course表,再刪除department表。或者是把外鍵刪除掉后,兩張表的刪除順序就不分先后了。
總結
以上是生活随笔為你收集整理的MySQL的外键约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kylin修改默认hbase names
- 下一篇: WebLogic清理缓存