oracle中使用on delete cascade和on delete set null來建立外來鍵
其面我們介紹了建立外來鍵約束時如果使用oracle預設的建立方式,在刪除被參照的資料時,將無法被刪除,這一點在oracle9i中給了我們更多靈活的選擇,我們可是使用on delete cascade和 on delete set null關鍵字來決定刪除被參照資料時是否要將參照這個資料的那些資料一併刪除,還是將那些參照這條資料的資料的對應值賦空。
例如下面這兩個表中分別存的時員工的基本資訊和公司的部門資訊。我們為
create table dept
(deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept primary key(deptno));
和create table emp
( empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp primary key(empno));
然後我們現在分別使用這兩個關鍵字來增加外來鍵試一下,首先我們來試一下on delete cascade
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade;
先增加外來鍵。然後插入資料。
insert into dept values(1,』銷售部』);
insert into dept values(2,』財務部』);
insert into emp values (2,』mary』,'song』,1);
insert into emp values (3,』linda』,'liu』,2);
insert into emp values (4,』linlin』,'zhang』,1);
然後現在我要刪除銷售部,會有什麼後果呢?
delete from dept where deptno = 1;
我們發現除了dept中的一條資料被刪除了,emp中兩條資料也被刪除了,其中emp中的兩條資料是參照了銷售部的這條資料的,這就很容易理解on delete cascade了。
接下來我們再來看on delete set null,顧名思義了,這種方式建立的外來鍵約束,當被參照的資料被刪除是,參照該資料的那些資料的對應值將會變為空值,下面我們還是通過試驗來證明on delete set null作用:
首先恢復剛才的那幾條資料,然後更改約束:
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;
然後我們在執行刪除操作:
delete from dept where deptno = 1;
你也會發現除了dept中的銷售部被刪除以外,emp中參照這條資料的兩條資料的dept的值被自動賦空了,這就是on delete set null的作用了。
使用on delete set null有一點需要注意的是,被參參照其他表的那一列必須能夠被賦空,不能有not null約束,對於上面的例子來說是emp中dept列一定不能有not null約束,如果已經定義了not null約束,又使用了on delete set null來刪除被參照的資料時,將會發生:ora-01407: 無法更新 (」dd」.」emp」.」dept」) 為 null的錯誤。
總的來講on delete cascade和on delete set null的作用是用來處理級聯刪除問題的,如果你需要刪除的資料被其他資料所參照,那麼你應該決定到底希望oracle怎麼處理那些參照這些即將要刪除資料的資料的,你可以有三種方式:
禁止刪除。這也是oracle預設的
將那些參照本值的資料的對應列賦空,這個需要使用on delete set null關鍵字
將那些參照本值的資料一併刪除,這個需要使用on delete cascade關鍵字
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...
oracle級聯刪除
oracle中使用on delete cascade和on delete set null來建立外來鍵 其面我們介紹了建立外來鍵約束時如果使用oracle預設的建立方式,在刪除被參照的資料時,將無法被刪除,這一點在oracle9i中給了我們更多靈活的選擇,我們可是使用on delete cascad...
Oracle系列 級聯刪除和級聯更新
必須宣告 此部落格 於oracle外來鍵級聯刪除和級聯更新 鑑於此前收藏的精彩部落格無料被刪除了,很是痛心,所以還是要複製一下 一 級聯刪除 oracle在外鍵的刪除上有no action 類似restrict cascade和set null三種行為。下面以學生 班級為例說明不同情況下的外來鍵刪除...