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

2022-09-24 14:27:15 字數 2877 閱讀 9151

表間的關係比較複雜,資料量又比較多,乙個個刪絕對會出大問題。於是實驗了幾種解決的辦法,現小結一下。

方法一:建立約束時設定級聯刪除

(但一般由於各種原因或出於各種考慮在建立資料庫時沒有設定級聯刪除)

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)

方法二:建立約束時沒有使用級聯刪除,在需要使用級聯刪除時,刪除原來的外來鍵約束,重建帶級聯刪除的約束

(實驗證明完全可行,注意需要對已經存在的資料進行驗證,否則新建的約束對原有資料不具備效率,預設是驗證的,若強制要求不驗證,使用novalidate關鍵詞。還有外來鍵引用的只能是唯一主鍵)

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)

(這樣就可以級聯刪除了,刪除完後,如果不放心這樣的約束條件,並且不嫌麻煩可以再重建為不帶級聯刪除等外來鍵約束,防止誤操作)

方法三:使程式設計客棧用觸發器(建立時沒有級聯刪除)

(比較靈活,可以根據自己編寫的程式進行,引用的不是唯一主鍵也可以)

(1)建立表及插入資料

sql語句:

複製** **如下:

create &n程式設計客棧bsp; 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 rep程式設計客棧lace 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'

方法四:若表間關係簡單(就兩張表),涉及到的記錄也很少(總共就幾行記錄),直接刪除子表中的相關記錄,再刪除父表中的記錄即可。

(前面的方法在涉及資料量較大以及表間關係比較複雜時才有效率上的優勢,簡單的直接刪除來的更快)

如上例中,直接刪除

sql語句:

複製** **如下:

delete from "fg123"."ordercombine"

where vipform ='1';

delete from "fg123"."ordercombine"

where formerid ='1'

本文標題: 解析oracle中多表級聯刪除的方法

本文位址:

Oracle 多表級聯刪除方法

建立資料庫時為了防止其他人不小心刪除操作錯誤,所有的外來鍵都沒有加級聯刪除。哪知,不知什麼時候自己入了一批錯誤的資料進去,入庫使用的是軟體自動的,一下點錯給自己帶來無盡麻煩啊,刪除就不好辦了。表間的關係比較複雜,資料量又比較多,乙個個刪絕對會出大問題。於是實驗了幾種解決的辦法,現小結一下。方法一 建...

mysql 多表級聯刪除

備忘一下 例如存在3個表,a,b,c.a,b是一對多關係 a id,name a b id,aid,name b b,c是一對多關係 b id,aid,name b c id,bid,name c 實現效果 刪除乙個a的id,與之關聯的b內aid的所有元組都刪除,b刪除就會把c關聯b的bid的所有元...

oracle 級聯刪除

1 查詢外來鍵及父表 select a.constraint name 外鍵名,a.table name 子表,b.table name 父表 from user constraints a,user constraints b where a.constraint type r and b.con...