SQLプライマリ外部キー制約

4002 ワード

概要:
プライマリ・キーPrimary keyは、エンティティを一意に表示します.データベースの実体整合性を保証し、データ中のデータの正確性と合理性を保証し、値を空ではない
唯一です.外部キーForeignは、テーブルとテーブルを関連付けるために使用されます.データベースの参照整合性を保証するために、外部キーの値は参照テーブルの参照列から取得する必要があります.
値は、空でも空でもかまいません.
機能:
(1)外部キー取値ルール:NULL値または参照のプライマリキー値.(2)NULL以外の値を挿入する場合、プライマリ・キー・テーブルにこの値がない場合は挿入できません.(3)更新時には,プライマリ・キー・テーブルにない値に変更することはできない.(4)プライマリ・キー・テーブル・レコードを削除する場合、外部キーを作成するときに、外部キー・レコードを選択してカスケード削除するか、削除を拒否するかを選択できます.(5)プライマリ・キー・レコードを更新する場合も,同様にカスケード更新と実行拒否の選択がある.
外部キー制約:
異なる外部キー制約により、2つのテーブルを緊密に結合できます.特に、カスケード操作を変更または削除すると、日常的なメンテナンス作業がより容易になります.
楽になる.一般的な外部キーには、カスケード方式、セットnull方式、および禁止(noaction/restrict)方式があります.
 
クラス表(T_Class)と学生表(T_Studio)を例にとると、これは典型的な一対多の関係であり、1つのクラスに複数の学生がいることができ、
1人の学生は1つのクラスにしか属しません.
まずクラステーブルを作成します.
create table T_Class (
id int not null,
name varchar(30),
primary key (id)
);

2つのレコードを挿入します.
insert into T_Class values (1, '  ');
insert into T_Class values (2, '  ');

次に、ユーザー・テーブルを作成し、外部キー参照関係をそれぞれ異なる制約で作成します.
1、カスケード方式
--    
create table T_Student (
id int not null,
name varchar(30),
ClassID int,
primary key (id),
foreign key (ClassID) references T_Class(id) on delete cascade on update cascade
);
--       
insert into T_Student values (1, '  ', 1);      --    
insert into T_Student values (2, '  ', 2);   --    
insert into T_Student values (3, '  ', 3);  --  ,    ,  3   ,          
--      
insert into T_Student values (1, '  ', 1);
insert into T_Student values (2, '  ', 2);
insert into T_Student values (3, '  ', 2);
delete from T_Class where id=2;             --  T_Student  2、3      
update T_Class set id=2 where id=1;         --  T_Student  1   ClassID     2

2、セットnull方式
--    
create table T_Student (
id int not null,
name varchar(30),
ClassID int,
primary key (id),
foreign key (ClassID) references T_Class(id) on delete set null on update set null
);
--       
insert into T_Student values (1, '  ', 1);    --    
insert into T_Student values (2, '  ', 2);  --    
insert into T_Student values (3, '  ', 3);  --  ,    ,  3   ,          
--      
insert into T_Student values (1, '  ', 1);
insert into T_Student values (2, '  ', 2);
insert into T_Student values (3, '  ', 2);
delete from T_Class where id=2;             --  T_Student  2、3   ClassID    NULL
update T_Class set id=2 where id=1;         --  T_Student  1   ClassID    NULL

3、禁止(no action/restrict)方式
--    
create table T_Student (
id int not null,
name varchar(30),
ClassID int,
primary key (id),
foreign key (ClassID) references T_Class(id) on delete no action on update no action
);
--       
insert into T_Student values (1, '  ', 1); --    
insert into T_Student values (2, '  ', 2);   --    
insert into T_Student values (3, '  ', 3);   --  ,    ,  3   ,          
--      
insert into T_Student values (1, '  ', 1);
insert into T_Student values (2, '  ', 2);
insert into T_Student values (3, '  ', 2);
delete from T_Class where id=2;             --  ,        ,         
update T_Class set id=2 where id=1;        --  ,        ,         

まとめ:
  
メイン外部キーは一昨日まとめられた貴重な経験であり、ずっと存在していることは自分の優位性があることを示しています.私たちは柔軟な応用をしなければなりません.図一のためではありません.
3枚目のテーブルを単純に乱用して置き換えます.データが1対または複数対1の場合、プライマリ・外部キー制約を使用することを考慮します.複数対複数の場合
関係する場合は、3枚目のテーブルを使用してインデックステーブルを作成することを考慮しますが、3枚目のテーブルはデータのメンテナンスに大きな迷惑をかけます.もちろん、大丈夫です.
絶対的に、主外部キーと3枚目の表のメリットとデメリットを理解した後、合理的に選択して利用します.この文章は、主外部キーの応用を重視することを注意するだけです.