Mysql foreignkey 相关
foreignkey? 是指一對多關(guān)系時(shí)建立的關(guān)系:
?外鍵是表中與另一個(gè)表的另一個(gè)字段匹配的字段。外鍵對相關(guān)表中的數(shù)據(jù)施加限制,這使MySQL能夠保持參照完整性。
操作:
能看懂圖嗎?
?
下面直接看代碼:
我們有兩個(gè)表:customers和orders.?每個(gè)客戶都有零個(gè)或多個(gè)訂單,每個(gè)訂單只能屬于一個(gè)客戶。customers表和orders表之間的關(guān)系是一對多關(guān)系,并且orders由該customerNumber字段指定的表中的外鍵建立。表中的customerNumber字段與orders表中的customerNumber主鍵字段相關(guān)??customers。
該customers?表稱為父表或被引用表,該orders表稱為子表或引用表。
外鍵可以是一列或一組列。子表中的列通常引用父表中的主鍵列。
一個(gè)表可能有多個(gè)外鍵,并且子表中的每個(gè)外鍵都可能引用不同的父表。
子表中的行必須包含父表中存在的值,例如,表中的每個(gè)訂單記錄orders必須具有表customerNumber中存在的值customers。因此,多個(gè)訂單可以指同一個(gè)客戶,這種關(guān)系被稱為一個(gè)(客戶)多個(gè)(訂單)或一對多。
有時(shí),子表和父表是相同的。外鍵返回到表的主鍵,例如下employees表:
該reportTo列是一個(gè)外鍵,它指的employeeNumber是employees表格的主鍵,以反映員工之間的報(bào)告結(jié)構(gòu),即每個(gè)員工向另一個(gè)員工報(bào)告,員工可以有零個(gè)或多個(gè)直接報(bào)告。我們有一個(gè)關(guān)于自聯(lián)接的特定教程,可以幫助您根據(jù)這種表格查詢數(shù)據(jù)。
該reportTo外鍵也被稱為遞歸或自引用的外鍵。
外鍵實(shí)施參照完整性,可幫助您自動(dòng)維護(hù)數(shù)據(jù)的一致性和完整性。例如,您無法為不存在的客戶創(chuàng)建訂單。
另外,您可以為customerNumber外鍵設(shè)置級(jí)聯(lián)刪除操作,這樣當(dāng)您刪除customers表中的客戶時(shí),與客戶關(guān)聯(lián)的所有訂單也會(huì)被刪除。這為您節(jié)省了使用多個(gè)DELETE語句?或DELETE JOIN語句的時(shí)間和精力。
與刪除相同,還可以定義級(jí)聯(lián)更新操作,以便customerNumber外鍵執(zhí)行跨表更新,而不使用多個(gè)UPDATE語句或UPDATE JOIN語句。
在MySQL中,InnoDB?存儲(chǔ)引擎支持外鍵,因此您必須創(chuàng)建InnoDB表才能使用外鍵約束。
?
?
?
添加外鍵代碼:
CONSTRAINT constraint_name FOREIGN KEY foreign_key_name (columns) REFERENCES parent_table(columns) ON DELETE action ON UPDATE action View Code
- 該CONSTRAINT子句允許您為外鍵約束定義約束名稱。如果你忽略它,MySQL會(huì)自動(dòng)生成一個(gè)名字。
- 該FOREIGN KEY子句指定子表中引用父表中主鍵列的列。你可以在FOREIGN KEY子句之后放置一個(gè)外鍵名,或者讓它為MySQL創(chuàng)建一個(gè)名字。注意MySQL會(huì)自動(dòng)創(chuàng)建一個(gè)帶有foreign_key_name名字的索引。
- 該REFERENCES子句指定父表和它的子表中的列引用的列。在規(guī)定的子表和父表的列數(shù)FOREIGN KEY和REFERENCES必須相同。
- 該ON DELETE子句允許您定義刪除父表中的記錄時(shí),子表中記錄發(fā)生的情況。如果您省略了ON DELETE子句并刪除了在子表中具有記錄的父表中的記錄,那么MySQL將拒絕刪除。此外,MySQL還為您提供了一些操作,以便您可以使用其他選項(xiàng),例如ON DELETE CASCADE??,要求MySQL刪除子表中引用父表中的記錄時(shí)父表中的記錄被刪除的記錄。如果您不希望刪除子表中的相關(guān)記錄,則可以使用該ON DELETE SET NULL操作。MySQL會(huì)將子表中的外鍵列值設(shè)置為NULL當(dāng)父表中的記錄被刪除時(shí),使用子表中的外鍵列必須接受NULL值的條件。請注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL將拒絕刪除。
- 該ON UPDATE子句允許您指定更新父表中的行時(shí)發(fā)生的子表中的行。ON UPDATE當(dāng)父表中的行更新時(shí),可以省略該子句以使MySQL拒絕對子表中的行進(jìn)行任何更新。該ON UPDATE CASCADE操作允許您執(zhí)行交叉表更新,當(dāng)父表ON UPDATE SET NULL中的行更新時(shí),該操作會(huì)將子表中的行中的值重置為值NULL。該ON UPDATE NO ACTION或UPDATE RESTRICT行動(dòng)拒絕任何更新。
?
?
?
MySQL創(chuàng)建表外鍵示例
下面的示例創(chuàng)建一個(gè)dbdemo數(shù)據(jù)庫和兩個(gè)表:categories和??products.每個(gè)類別具有一個(gè)或多個(gè)產(chǎn)品和每個(gè)產(chǎn)品只屬于一個(gè)類別。表中的cat_id字段products被定義為帶有UPDATE ON CASCADE和DELETE ON RESTRICT動(dòng)作的外鍵。
?
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; View Code將外鍵添加到表中
MySQL添加外鍵語法
要將外鍵添加到現(xiàn)有表中,可以使用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; View CodeMySQL添加外鍵示例
現(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; View Code要將外鍵添加到products表中,請使用以下語句:
2 3 4 5 ALTER TABLE products ADD FOREIGN KEY fk_vendor(vdr_id) REFERENCES vendors(vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE; View Code現(xiàn)在,該products表有兩個(gè)外鍵,一個(gè)categories表指向表,另一個(gè)指向vendors表。
刪除MySQL外鍵
您還可以使用該ALTER TABLE語句刪除外鍵,如下所示:
ALTER TABLE table_name DROP FOREIGN KEY constraint_name; View Code在上面的聲明中:
- 首先,指定要從中刪除外鍵的表名。
- 其次,您將約束名稱放在該DROP FOREIGN KEY子句之后。
注意,這constraint_name是在創(chuàng)建或向表中添加外鍵時(shí)指定的約束的名稱。如果你忽略它,MySQL會(huì)為你生成一個(gè)約束名稱。
要獲取表的生成約束名稱,請SHOW CREATE TABLE按如下所示使用該語句:
?
SHOW CREATE TABLE table_name;例如,要查看products表的外鍵,可以使用以下語句:
SHOWS CREATE TABLE products;?
?
?
On Delete和On Update都有Restrict,No Action, Cascade,Set Null屬性。現(xiàn)在分別對他們的屬性含義做個(gè)解釋。
- ON DELETE
restrict(約束):當(dāng)在父表(即外鍵的來源表)中刪除對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則不允許刪除。
no action:意思同restrict.即如果存在從數(shù)據(jù),不允許刪除主數(shù)據(jù)。
cascade(級(jí)聯(lián)):當(dāng)在父表(即外鍵的來源表)中刪除對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則也刪除外鍵在子表(即包含外鍵的表)中的記錄。
set null:當(dāng)在父表(即外鍵的來源表)中刪除對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表中該外鍵值為null(不過這就要求該外鍵允許取null)
- ON UPDATE
restrict(約束):當(dāng)在父表(即外鍵的來源表)中更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則不允許更新。
no action:意思同restrict.
cascade(級(jí)聯(lián)):當(dāng)在父表(即外鍵的來源表)中更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則也更新外鍵在子表(即包含外鍵的表)中的記錄。
set null:當(dāng)在父表(即外鍵的來源表)中更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表中該外鍵值為null(不過這就要求該外鍵允許取null)。
注:NO ACTION和RESTRICT的區(qū)別:只有在及個(gè)別的情況下會(huì)導(dǎo)致區(qū)別,前者是在其他約束的動(dòng)作之后執(zhí)行,后者具有最高的優(yōu)先權(quán)執(zhí)行。
轉(zhuǎn)載于:https://www.cnblogs.com/xz2ll/p/9252168.html
總結(jié)
以上是生活随笔為你收集整理的Mysql foreignkey 相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解 VS2015 如何打包winfor
- 下一篇: 19 python正则表达式及相关函数