カスケード削除

2611 ワード

参照整合性:外部キー制約は、フィールド(またはフィールドのセット)の値が別のテーブルに表示される値に一致する必要があることを宣言します.この挙動を2つの相関テーブル間の参照整合性と呼ぶ.
≪カスケード操作|Cascade Operations|oem_src≫:制限とカスケード削除の2つの最も一般的なオプションです.RESTRICTは参照された行の削除を禁止します.NO ACTIONは、制約をチェックする際に参照行が存在する場合、エラーを投げ出すことを意味する.何も宣言しない場合は、デフォルトの動作です.この2つの選択の実際の違いは、NO ACTIONが制約チェックをトランザクションの遅い時間に延期することを許可し、RESTRICTはできません.CASCADEは、参照されたローを削除すると、参照されたローが自動的に削除されることを宣言します.外部キーフィールドのアクションには、SET NULLとSET DEFAULTの2つのオプションがあります.これらのオプションは、参照行が削除されたときに、参照フィールドをNULLとデフォルト値に設定します.これらのオプションは、観察と制約の境地から逃れることはできません.たとえば、アクション宣言SET DEFAULTがデフォルト値で外部キーを満たすことができない場合、アクションは失敗します.ON DELETEと同様にON UPDATEオプションもあり、参照フィールドが変更(更新)されたときに呼び出され、使用可能な動作は同じです.1つの参照テーブルのDELETE行または参照フィールドのUPDATE列から参照テーブルをスキャンして、行から古い数値を一致させる必要があります.参照カラムにインデックスを作成するには、常に良いアイデアです.これは常に必要ではなく、インデックスをどのように構築するかには他にも多くの選択肢があるため、外部キーの制約宣言は参照フィールドでインデックスを自動的に生成できません.
 
データベースに外部キーと外部キーのカスケードを作成するメリット:
1.データベース側でデータの整合性を確保し、開発者の作業を減少させる.プライマリ・テーブルのレコードを削除する場合は、まずサブテーブルのレコードを削除してから、プライマリ・テーブルのレコードを削除する必要はありません.カスケード削除後、プライマリ・テーブル・レコードを直接削除すると、サブテーブルのレコードが自動的に削除されます.
2.データの完了とデータベース操作のために、カスケードが必要かどうかにかかわらず、外部キー制約が必要です.データベース内で外部キーと外部キーのカスケードを作成する欠点:
1.カスケードはデータを誤って削除しやすい.発生する可能性のある状況は、システムのメンテナンス担当者を交換して、カスケード削除があることを知らない場合、データを誤って削除すると、システムが停止する可能性があります.
2.性能原因.データベースに外部キー制約を設定することで、データの整合性を制約し、データベースの圧力を無形に増加させます.プライマリ・テーブルとカスケード・テーブルは、観察され、制約されています.
3.メンテナンスが容易ではない.データベース・テーブルが多すぎたり、カスケードが複雑すぎたりすると、データベースのメンテナンス操作も複雑になります.
 
以下はデータベースカスケードSQLです.
--    
CREATE TABLE lp.main_table
(
  main_id bigint NOT NULL,
  main_info character varying(1000),
  CONSTRAINT main_table_pkey PRIMARY KEY (main_id)
)
ALTER TABLE lp.main_table OWNER TO lp;
--      
ALTER TABLE lp.main_table ADD CONSTRAINT main_table_pkey PRIMARY KEY(main_id);
--     
CREATE TABLE lp.sub_table
(
  sub_id bigint,
  sub_info character varying,
  main_id bigint ,
  --      ,         ,            ,
  --     ,             
  foreign key (main_id) references lp.main_table(main_id) ON DELETE CASCADE
) ;
ALTER TABLE lp.sub_table OWNER TO lp ;

--      
insert into lp.main_table values(1,'111111') ;
insert into lp.main_table values(3,'333333') ;
--      ,   id=1      
insert into lp.sub_table values(1,'111111',1) ;
insert into lp.sub_table values(2,'222222',1) ;

--      ,           
delete from lp.main_table where main_id = 1 ;

select * from lp.main_table ;
select * from lp.sub_table ;