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