如果表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外來鍵和外來鍵約束
1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...
mysql 外來鍵和外來鍵約束
1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...
外來鍵約束 外來鍵級聯操作
建立db2資料庫 create database db2 使用db2資料庫 use db2 外來鍵約束 標準語法 constraint 外鍵名 foreign key 本表外來鍵列名 references 主表名 主表主鍵列名 建表時新增外來鍵約束 建立user使用者表 create table u...