Oracle12C--主外來鍵約束刪除資料問題--級聯操作(九)
阿新 • • 發佈:2019-01-02
知識點的梳理:
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
DELETE FROM advice WHERE mid=1 ;
DELETE FROM member WHERE mid=1 ;
COMMIT ;
這樣的刪除較為複雜,可以通過級聯操作來簡化操作!
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:級聯設定null(on
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依然有父表的值,但它們與父表毫無關係了;