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'