一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - 解析Oracle中多表級聯刪除的方法

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

2019-11-26 20:07Oracle教程網 Oracle

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

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

方法一:創建約束時設定級聯刪除
(但一般由于各種原因或出于各種考慮在創建數據庫時沒有設定級聯刪除)
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   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'

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产欧美另类va在线观看 | 欧美成人免费观看bbb | 亚洲精品久久久久AV无码 | 激情小视频 | 国产视频一区 | 91精品啪在线观看国产线免费 | 99热r| 欧美日韩综合一区 | 水野朝阳厨房系列在线观看 | 日韩高清在线免费看 | 亚洲欧美国产另类 | 67id人成观看免费 | 久久re热在线视频精99 | 男人香蕉好大好爽视频 | 五月色婷婷久久综合 | 日韩人成免费网站大片 | 小寡妇好紧进去了好大看视频 | 成年美女黄网站色视频大全免费 | 精品国产在线观看 | 深夜在线观看网站 | 好男人免费高清在线观看2019 | 99re8在这里只有精品23 | 免费观看视频在线播放 | 国产中文在线视频 | 亚洲第一色网站 | 国产精品久久久精品视频 | 香蕉国产人午夜视频在线 | 女人肮脏的交易中文字幕未删减版 | 久久精品AV一区二区无码 | 亚洲一区二区日韩欧美gif | 国产精品探花一区在线观看 | 非洲黑人xxxxxbbbbb | 免费日本在线 | 久久91精品国产91 | 国产在线成人精品 | 免费在线视频成人 | 麻豆视频入口 | 国产精品亚洲精品青青青 | 国内小情侣一二三区在线视频 | 日本手机在线 | 日韩精品视频美在线精品视频 |