外來鍵約束的三種方式

2022-08-02 02:09:10 字數 4641 閱讀 3466

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

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

首先建立使用者組表: 

sql** 

create table t_group (   

id int not null,   

name varchar(30),   

primary key (id)   

);  

create table t_group (id int not null,name varchar(30),primary key (id));

並插入兩條記錄: 

sql** 

insert into t_group values (1, 'group1');   

insert into t_group values (2, 'group2');  

insert into t_group values (1, 'group1');insert into t_group values (2, 'group2');

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

1、級聯(cascade)方式 

sql** 

create table t_user (   

id int not null,   

name varchar(30),   

groupid int,   

primary key (id),   

foreign key (groupid) references t_group(id) on delete cascade on update cascade  

);  

create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete cascade on update 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不存在,與參照完整性約束不符  

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  

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 not null,   

name varchar(30),   

groupid int,   

primary key (id),   

foreign key (groupid) references t_group(id) on delete set null on update set null  

);   

參照完整性測試   

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  

置空方式create table t_user (id int not null,name varchar(30),groupid int,primary key (id),foreign key (groupid) references t_group(id) on delete set null on update set null);參照完整性測試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被設定為nullupdate t_group set id=2 where id=1;          --導致t_user中的1記錄的groupid被設定為null

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

sql** 

禁止方式   

create table t_user (   

id int not null,   

name varchar(30),   

groupid int,   

primary key (id),   

foreign key (groupid) references t_group(id) on delete no action on update no action  

);   

參照完整性測試   

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的三種外來鍵約束方式

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

restrict 外來鍵約束 外來鍵約束的三種方式

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

總結mysql的三種外來鍵約束方式

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