Oracle實現級聯刪除的四種方法

2021-04-27 10:38:37 字數 2642 閱讀 7116

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

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

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

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)

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

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   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'

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

如上例中,直接刪除

sql語句:

delete from "fg123"."ordercombine"

where vipform =』1';

delete from "fg123"."ordercombine"

where formerid =』1';

級聯操作的四種型別詳解

詳情 現在我們分別介紹以上四種級聯型別的詳細情況。1.cascadetype.refresh 級聯重新整理 使用場景,當我們從資料庫中請求了一條資料,在我們對這條資料進行業務處理的時候,另乙個使用者可能會修改資料庫中的這條資料的記錄,那麼此時我們就需要進行級聯重新整理了,否則我們處理的資料就失去了意...

多型的四種實現

多型分為兩種 通用的多型和特定的多型。兩者的區別是前者對工作的型別不加限制,允許對不同型別的值執行相同的 後者只對有限數量的型別有效,而且對不同型別的值可能要執行不同的 通用的多型又分為引數多型 parametric 和包含多型 inclusion 特定的多型分為過載多型 overloading 和...

ADT Queue 四種實現

講四種實現 普通陣列模擬佇列實現不講,很輕便也很實用,不難自己隨意寫寫就行 佇列和棧在使用時,即使運算元很多,但一般實時儲存在其中的資料並不多,於是我們採用迴圈佇列的方式來節省空間。那迴圈佇列其實就是,當佇列中申請好的連續空間中已經填滿資料時 並不是指佇列已滿,佇列是只夾在front和rear之間的...