Oracleの複数表連結の削除方法を解析します。


テーブルの間の関係は複雑で、データ量も多いので、削除すると必ず大きな問題が発生します。そこでいくつかの解決方法を実験しました。まとめてみます。方法1:制約を作成する時に、固定段連結を削除します。(しかし、一般的には様々な理由でデータベースを作成する時に、固定段連結を削除していません。)SQL文:

CREATE TABLE "U_WEN_BOOK"."FARTAB" ("FAR_ID" NUMBER(10) NOT NULL,
"FAR_NAME" VARCHAR2(10), "OTHER_NAME" VARCHAR2(10),
CONSTRAINT "PK_FER" PRIMARY KEY("FAR_ID"))

CREATE TABLE "U_WEN_BOOK"."CHILTAB" ("CHIL_ID" NUMBER(10) NOT
    NULL, "CHIL_NAME" VARCHAR2(10), "CHIL_OTHER" VARCHAR2(10),
    "FAR_ID" NUMBER(10) NOT NULL,
    CONSTRAINT "PK_CHIL" PRIMARY KEY("CHIL_ID"),
    CONSTRAINT "FK_CHIL" FOREIGN KEY("FAR_ID")
REFERENCES "U_WEN_BOOK"."FARTAB"("FAR_ID") ON DELETE CASCADE)
方法2:制約を作成する時に、カスケード削除を使用していません。カスケード削除を必要とする時、元の外結合制約を削除し、バンドカスケード削除の制約を再構築します。注意既存のデータを検証する必要があります。そうでないと、新規作成の制約は元のデータに対して効率がなく、デフォルトでは検証されています。強制的に検証しないと、NOVALLIDATEキーワードを使用します。外部キーの参照は唯一のキーだけです。SQL文:

ALTER TABLE "U_WEN_BOOK"."GCHILTAB1"
    DROP CONSTRAINT "FK_G1"
ALTER TABLE "U_WEN_BOOK"."GCHILTAB1"
  ADD (CONSTRAINT "FK_G1" FOREIGN KEY()
    REFERENCES "U_WEN_BOOK"."CHILTAB"()
    ON DELETE CASCADE)
( , , , , )
方法3:トリガーを使用します。(作成時にはカスケード削除がありません。)引用は、唯一のメインキーでなくても良いです。(1)テーブルの作成と挿入データSQL文:

create   table orderCombine   (  
O_Id                     VARCHAR2(16)     not   null,  
OrderId           VARCHAR2(15)     not   null,                        
FormerId         VARCHAR2(16)     not   null,  
constraint   PK_ORDERCOMBINE   primary   key   (FormerId) );
   create   table   VIPForm     (  
V_Id                     VARCHAR2(16)       not   null,              
IsValid           CHAR(1)   default   '0'     not   null     ,                  
Constraint fk_vipform foreign key(V_id)   references   ordercombine(formerid) );  
insert into orderCombine values('1','1','1'); insert into orderCombine values('2','2','2'); insert into vipform values('1','5'); insert into vipform values('2','4'); insert into vipform values('1','2');
の結果:(2)フリップフロップの作成:SQL:

CREATE OR REPLACE TRIGGER "FG123"."TER_OV"
BEFORE
DELETE ON "ORDERCOMBINE" FOR EACH ROW
BEGIN
DELETE   FROM   VIPForm
WHERE   VIPForm.V_Id=:OLD.FormerId;
END;
(3)削除と結果:SQL:

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE FormerId ='1'
方法4:テーブル間の関係が簡単であれば(2つのテーブルについて)関連する記録も少ないです。親テーブルのレコードを削除すればいいです。前の方法は、データ量が大きいことと、表間関係が複雑であることに関連してこそ、効率的な利点があり、簡単に直接削除するほうが早いです。上記の例のように、SQL文を直接削除します。

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE VIPForm ='1';

DELETE FROM "FG123"."ORDERCOMBINE"
WHERE FormerId ='1'