外部キーコンストレイント


テーブルAのプライマリ・キーがテーブルBのフィールドである場合、このフィールドはテーブルBの外部キー、テーブルAはプライマリ・テーブル、テーブルBはスレーブ・テーブルと呼ばれる.外部キーは参照整合性を実現するために使用され、異なる外部キー制約方式により、2つのテーブルを緊密に結合することができ、特に修正または削除されたカスケード操作により、日常的なメンテナンス作業がより容易になります.ここではMySQLを例に,3つの外部キー制約方式の違いと関連をまとめる.
ここでは、ユーザテーブルとユーザグループテーブルを例にとると、これは典型的な多対一関係であり、複数のユーザが1つのユーザグループに対応する.
まず、ユーザー・グループ・テーブルを作成します.

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

2つのレコードを挿入します.

insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');

次に、ユーザー・テーブルを作成し、外部キー参照関係をそれぞれ異なる制約で作成します.
1、カスケード方式

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、セット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;          --  ,        ,