mysql外來鍵約束方式
如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主表,表b稱為從表。外來鍵是用來實現參照完整性的,不同的外來鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。這裡以mysql為例,總結一下3種外來鍵約束方式的區別和聯絡。
www.2cto.com
這裡以使用者表和使用者組表為例,這是乙個典型的多對一關係,多個使用者對應於乙個使用者組。
首先建立使用者組表:
建立使用者組表
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; #錯誤,從表中有相關引用,因此主表中無法修改
注:在mysql中,restrict方式與no action方式作用相同。
mysql約束與外來鍵 MySQL 外來鍵與約束
外來鍵的建立 建表如下 create table parent id int not null,primary key id type innodb create table child id int,parent id int,foreign key parent id references pa...
MySQL 外來鍵約束
建立測試主表.id 是主鍵.create table test main id int,value varchar 10 primary key id 建立測試子表.create table test sub id int,main id int,value varchar 10 primary k...
MySQL外來鍵約束
innodb型別表有乙個其他儲存引擎不支援的特性 外來鍵約束。當b表的外來鍵關聯到a表的主鍵時 表b是父表a表的子表 如果刪除了a表,那麼b中的外來鍵則仍然關聯著乙個不存在的表的主鍵。而外鍵約束則設定了當約束被破壞時應該應用的的規則,包括防止約束破壞。建立乙個外來鍵約束的語法是 foreign ke...