熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

解析Oracle中多表級聯刪除的方法

2013-11-13 22:24:40  來源: Oracle 
創建數據庫時為了防止其他人不小心刪除操作錯誤 所有的外鍵都沒有加級聯刪除哪知不知什麼時候自己入了一批錯誤的數據進去入庫使用的是軟件自動的一下點錯給自己帶來無盡麻煩啊刪除就不好辦了  

  表間的關系比較復雜數據量又比較多一個個刪絕對會出大問題於是實驗了幾種解決的辦法現小結一下

方法一創建約束時設定級聯刪除
(但一般由於各種原因或出於各種考慮在創建數據庫時沒有設定級聯刪除)
SQL語句

復制代碼 代碼如下:
CREATE TABLE "U_WEN_BOOK""FARTAB" ("FAR_ID" NUMBER() NOT NULL
"FAR_NAME" VARCHAR() "OTHER_NAME" VARCHAR()
CONSTRAINT "PK_FER" PRIMARY KEY("FAR_ID"))

CREATE TABLE "U_WEN_BOOK""CHILTAB" ("CHIL_ID" NUMBER() NOT
    NULL "CHIL_NAME" VARCHAR() "CHIL_OTHER" VARCHAR()
    "FAR_ID" NUMBER() 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)

  
方法二創建約束時沒有使用級聯刪除在需要使用級聯刪除時刪除原來的外鍵約束重建帶級聯刪除的約束
(實驗證明完全可行注意需要對已經存在的數據進行驗證否則新建的約束對原有數據不具備效率默認是驗證的若強制要求不驗證使用NOVALIDATE關鍵詞還有外鍵引用的只能是唯一主鍵)
SQL語句

復制代碼 代碼如下:
ALTER TABLE "U_WEN_BOOK""GCHILTAB"
    DROP CONSTRAINT "FK_G"
ALTER TABLE "U_WEN_BOOK""GCHILTAB"
  ADD (CONSTRAINT "FK_G" FOREIGN KEY()
    REFERENCES "U_WEN_BOOK""CHILTAB"()
    ON DELETE CASCADE)
(這樣就可以級聯刪除了刪除完後如果不放心這樣的約束條件並且不嫌麻煩可以再重建為不帶級聯刪除等外鍵約束防止誤操作)

  
方法三使用觸發器(創建時沒有級聯刪除)
(比較靈活可以根據自己編寫的程序進行引用的不是唯一主鍵也可以)
)創建表及插入數據
SQL語句

復制代碼 代碼如下:
create   table orderCombine   (  
O_Id                     VARCHAR()     not   null  
OrderId           VARCHAR()     not   null                        
FormerId         VARCHAR()     not   null  
constraint   PK_ORDERCOMBINE   primary   key   (FormerId) );
   create   table   VIPForm     (  
V_Id                     VARCHAR()       not   null              
IsValid           CHAR()   default        not   null                       
Constraint fk_vipform foreign key(V_id)   references   ordercombine(formerid) );  
insert into orderCombine values(); insert into orderCombine values(); insert into vipform values(); insert into vipform values(); insert into vipform values();

  
結果
)創建觸發器
SQL

復制代碼 代碼如下:
CREATE OR REPLACE TRIGGER "FG""TER_OV"
BEFORE
DELETE ON "ORDERCOMBINE" FOR EACH ROW
BEGIN
DELETE   FROM   VIPForm
WHERE   VIPFormV_Id=:OLDFormerId;
END;

  
)刪除及結果
SQL

復制代碼 代碼如下:
DELETE FROM "FG""ORDERCOMBINE"
WHERE FormerId =

  
方法四若表間關系簡單(就兩張表)涉及到的記錄也很少(總共就幾行記錄)直接刪除子表中的相關記錄再刪除父表中的記錄即可
(前面的方法在涉及數據量較大以及表間關系比較復雜時才有效率上的優勢簡單的直接刪除來的更快)
如上例中直接刪除
SQL語句

復制代碼 代碼如下:

  
DELETE FROM "FG""ORDERCOMBINE"
WHERE VIPForm =

DELETE FROM "FG""ORDERCOMBINE"
WHERE FormerId =


From:http://tw.wingwit.com/Article/program/Oracle/201311/19027.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.