外鍵約束方式

[原創]外鍵約束方式

     如果表A的主關鍵字是表B中的字段,則該字段稱爲表B的外鍵,表A稱爲主表,表B稱爲從表。外鍵是用來實現參照完整性的,不同的外鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。這裏以MySQL爲例,總結一下3種外鍵約束方式的區別和聯繫。
     這裏以用戶表和用戶組表爲例,這是一個典型的多對一關係,多個用戶對應於一個用戶組。
     首先創建用戶組表:
創建用戶組表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
並插入兩條記錄:
插入記錄
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');
下面創建用戶表,分別以不同的約束方式創建外鍵引用關係:
1、級聯(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
);
參照完整性測試
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記錄級聯刪除
update t_group set id=2 where id=1;          #導致t_user中的1記錄的groupid級聯修改爲2
2、置空(set 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', 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)方式
禁止方式
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中,restrict方式與no action方式作用相同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章