MySQL 資料庫外來鍵

2021-06-26 19:28:42 字數 3420 閱讀 8732

如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主表,表b稱為從表。外來鍵是用來實現參照完整性的,不同的外來鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。這裡以mysql為例,總結一下3種外來鍵約束方式的區別和聯絡。 

這裡以使用者表和使用者組表為例,這是乙個典型的多對一關係,多個使用者對應於乙個使用者組。 

首先建立使用者組表: 

sql**  

create

table t_group (  

id int

notnull,  

name

varchar(30),  

primary

key (id)  

);  

並插入兩條記錄: 

sql**  

insert

into t_group values (1, 'group1');  

insert

into t_group values (2, 'group2');  

下面建立使用者表,分別以不同的約束方式建立外來鍵引用關係: 

1、級聯(cascade)方式 

sql**  

create

table t_user (  

id int

notnull,  

name

varchar(30),  

groupid int,  

primary

key (id),  

foreign

key (groupid) references t_group(id) on

delete

cascade

onupdate

cascade

);  

參照完整性測試 

sql**  

insert

into t_user values (1, 'qianxin', 1); --可以插入

insert

into t_user values (2, 'yiyu', 2);    --可以插入

insert

into t_user values (3, 'dai', 3);    --錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試 

sql**  

insert

into t_user values (1, 'qianxin', 1);  

insert

into t_user values (2, 'yiyu', 2);  

insert

into t_user values (3, 'dai', 2);  

delete

from t_group where id=2;              --導致t_user中的2、3記錄級聯刪除

update t_group set id=2 where id=1;          --導致t_user中的1記錄的groupid級聯修改為2

2、置空(set null)方式 

sql**  

置空方式  

create

table t_user (  

id int

notnull,  

name

varchar(30),  

groupid int,  

primary

key (id),  

foreign

key (groupid) references t_group(id) on

delete

setnull

onupdate

setnull

);  

參照完整性測試  

insert

into t_user values (1, 'qianxin', 1); --可以插入

insert

into t_user values (2, 'yiyu', 2);    --可以插入

insert

into t_user values (3, 'dai', 3);     --錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試  

insert

into t_user values (1, 'qianxin', 1);  

insert

into t_user values (2, 'yiyu', 2);  

insert

into t_user values (3, 'dai', 2);  

delete

from t_group where id=2;              --導致t_user中的2、3記錄的groupid被設定為null

update t_group set id=2 where id=1;          --導致t_user中的1記錄的groupid被設定為null

3、禁止(no action / restrict)方式 

sql**  

禁止方式  

create

table t_user (  

id int

notnull,  

name

varchar(30),  

groupid int,  

primary

key (id),  

foreign

key (groupid) references t_group(id) on

delete

noaction

onupdate

noaction

);  

參照完整性測試  

insert

into t_user values (1, 'qianxin', 1); --可以插入

insert

into t_user values (2, 'yiyu', 2);    --可以插入

insert

into t_user values (3, 'dai', 3);     --錯誤,無法插入,使用者組3不存在,與參照完整性約束不符

約束方式測試  

insert

into t_user values (1, 'qianxin', 1);  

insert

into t_user values (2, 'yiyu', 2);  

insert

into t_user values (3, 'dai', 2);  

delete

from t_group where id=2;              --錯誤,從表中有相關引用,因此主表中無法刪除

update t_group set id=2 where id=1;          --錯誤,從表中有相關引用,因此主表中無法修改

MySQL資料庫外來鍵

設定外來鍵 外來鍵及功能 成績表 參照表也叫子表 中的學號來自學生表 被參照表也叫父表 成績表中的課程號來自課程表 當要刪除或更新被參照表中的給字段的值時,參照錶該字段的值如何改變。在on delete on update設定參照動作 restrict 限制 cascade 級聯 set null ...

mysql資料庫教程 外來鍵 MySQL資料庫外來鍵

設定外來鍵 外來鍵及功能 成績表 參照表也叫子表 中的學號來自學生表 被參照表也叫父表 成績表中的課程號來自課程表 當要刪除或更新被參照表中的給字段的值時,參照錶該字段的值如何改變。在on delete on update設定參照動作 restrict 限制 cascade 級聯 set null ...

MySql資料庫外來鍵關聯

設定外來鍵關聯是可以設定在刪除時和在更新時的操作,其中有三個比較重要的。1 層疊 級聯 cache 2 設為null set null 3 無動作 no action 1 層疊,當主表刪除一條記錄,那麼從表對應的引用了被刪除的記錄的主鍵作為外來鍵的記錄將會級聯刪除。更新時候也一樣。2 設為null,...