SQL Server 外來鍵約束方式

2021-05-24 12:52:48 字數 2898 閱讀 8136

如果表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', 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)方式 

禁止方式

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;          #錯誤,從表中有相關引用,因此主表中無法修改

SQL Server 外來鍵約束方式

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

SQL Server外來鍵約束

sql server中主外來鍵的定義 1.create table dept dept no int primary key,dept name nvarchar 50 not null insert into dept values 10,it 20,finance 30,engneer crea...

Sql Server 主鍵 外來鍵約束

主鍵約束 表通常具有包含唯一標識表中每一行的值的一列或一組列。這樣的一列或多列稱為表的主鍵 pk 用於強制表的實體完整性。由於主鍵約束可保證資料的唯一性,因此經常對標識列定義這種約束。如果為表指定了主鍵約束,資料庫引擎 將通過為主鍵列自動建立唯一索引來強制資料的唯一性。當在查詢中使用主鍵時,此索引還...