1. 程式人生 > >Oracle12C--主外來鍵約束刪除資料問題--級聯操作(九)

Oracle12C--主外來鍵約束刪除資料問題--級聯操作(九)

知識點的梳理:

on delete cascade:當主表資料刪除時,對應的子表資料同時刪除;

on delete set null:當主表資料刪除時,對應的子表資料設定為null

問題1:刪除父表資料前需要先刪除所有子表的對應資料

於子表的所有資料都要和父表的資料對應,所以在刪除父表資料時需要先將子表中對應的資料刪除乾淨,否則將無法刪除

示例1:刪除member表中編號為“1”的資料(mid=1),此時沒有刪除子表(advice)資料

DELETE FROM member WHERE mid=1 ;

member中的mid資料與advice有關聯關係,所以只能先刪除advice

中的資料,才能刪除member的資料;先刪除子表(advice)中mid=1的資料,之後再刪除父表(member)中mid=1的資料

DELETE FROM advice WHERE mid=1 ;
DELETE FROM member WHERE mid=1 ;
COMMIT ;


這樣的刪除較為複雜,可以通過級聯操作來簡化操作!

級聯操作1:級聯刪除(on delete cascade 級聯刪除是指在建立外來鍵約束時通過on delete cascade子句設定,這樣在刪除父表資料時,由父表資料關聯的所有子表資料都會被同時刪除 示例:修改表建立語法,增加級聯刪除,同時配置測試資料
DROP TABLE advice PURGE ;
DROP TABLE member PURGE ;
CREATE TABLE member (
    mid       NUMBER    ,
    name      VARCHAR2(200)   NOT NULL ,
    CONSTRAINT pk_mid PRIMARY KEY (mid) 
) ;
CREATE TABLE advice (
    adid      NUMBER ,
    content   CLOB            NOT NULL ,
    mid       NUMBER ,
    CONSTRAINT pk_adid PRIMARY KEY (adid) ,
    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
) ;
INSERT INTO member (mid,name) VALUES (1,'李興華') ; 
INSERT INTO member (mid,name) VALUES (2,'董鳴楠') ;
INSERT INTO advice (adid,content,mid) VALUES (1,'應該提倡內部溝通機制,設定總裁郵箱',1) ;
INSERT INTO advice (adid,content,mid) VALUES (3,'要多開展員工培訓活動,讓員工更加有歸屬感',2) ;
COMMIT ;

此時刪除member表中編號為1的成員資訊,可以觸發級聯操作,完成刪除動作;

DELETE FROM member WHERE mid=1 ;
級聯操作2:級聯設定nullon delete set null 該級聯操作在刪除父表時,子表的資料不會被刪除,並將與父表關聯的欄位設定為null 示例:修改表的建立語句,增加ON DELETE SET NULL子句
DROP TABLE advice PURGE ;
DROP TABLE member PURGE ;
CREATE TABLE member (
    mid       NUMBER    ,
    name      VARCHAR2(200)   NOT NULL ,
    CONSTRAINT pk_mid PRIMARY KEY (mid) 
) ;
CREATE TABLE advice (
    adid      NUMBER ,
    content   CLOB            NOT NULL ,
    mid       NUMBER ,
    CONSTRAINT pk_adid PRIMARY KEY (adid) ,
    CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL
) ;
INSERT INTO member (mid,name) VALUES (1,'hey') ; 
INSERT INTO member (mid,name) VALUES (2,'yan') ;
INSERT INTO advice (adid,content,mid) VALUES (1,'應該提倡內部溝通機制,設定總裁郵箱',1) ;
INSERT INTO advice (adid,content,mid) VALUES (3,'要多開展員工培訓活動,讓員工更加有歸屬感',2) ;
COMMIT ;
刪除member表中mid為1的記錄
DELETE FROM member WHERE mid=1 ;


問題2:刪除父表時需要先將子表刪除

上例是刪除父表的某一個數據,如果直接刪除父表則會出現以下錯誤:

如果想刪除父表,只能先刪除子表,在刪除父表

示例:先刪除子表(advice),再刪除父表(member
DROP TABLE advice PURGE ;
DROP TABLE member PURGE ;
強制刪除父表: 這種刪除方式會之間幹掉父表,但是子表,以及與父表關聯的欄位資料都會得到保留; 如果使用了此種方式,就不能再直接使用purge選項了;
DROP TABLE member CASCADE CONSTRAINT ;
使用了上面的sql刪除member表後,查詢advice表。可以發現mid依然有父表的值,但它們與父表毫無關係了;