Oracle中的級聯(cascade)應用

級聯刪除,比如你刪除某個表的時候後面加這個關鍵字,會在刪除這個表的同時刪除和該表有關係的其他對象

1.級聯刪除表中的信息,當表A中的字段引用了表B中的字段時,一旦刪除B中該字段的信息,表A的信息也自動刪除。(當父表的信息刪除,子表的信息也自動刪除)

例如下面這兩個表中分別存的時員工的基本信息和公司的部門信息。我們爲
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關鍵字

 

2。Oracle 刪除用戶時報 “必須指定 CASCADE 以刪除 'SE'”

這說明你要刪除的oracle 用戶"SE" 下面還有數據庫對象,如 table, view 等,這樣你刪除用戶時必須加選項 cascade:  drop user se cascade;  表示刪除用戶SE,同時刪除 SE 用戶下的所有數據對象。  還有一個辦法就是先刪除 se 下的所有數據對象,使 se 變成一個啥也沒有的空用戶,再 drop user se;   
3.ORACLE中Drop table cascade constraints之後果  
當你要drop一個table時,如果刪除table的動作會造成trigger或constraint產生矛盾,系統會出現錯誤警告的訊息而不會允許執行.。一個極簡單的例子,例如你有一個員工基本資料表,上面可能有員工編號和員工姓名等字段,另外有一個員工銷售表,上面有員工編號和員工銷售額兩個字段,員工薪資表的員工編號字段爲一個foreign key參照到員工基本資料表的員工編號:
  SQL> drop table t; 
  Table dropped. 
  SQL> drop table t1; 
  Table dropped. 
  SQL> create table t (id number,name varchar2(20)); 
  Table created. 
  SQL> create table t1 (id number,sal number); 
Table created. 
  SQL> alter table t add constraint t_pk primary key (id); 
  Table altered. 
  SQL> alter table t1 add constraint t_fk foreign key (id) references t (id); 
  Table altered. 
  SQL> insert into t values (1,#39;JACK'); 
  1 row created. 
  SQL> insert into t values (2,#39;MARY'); 
  1 row created. 
  SQL> COMMIT; 
  Commit complete. 
  SQL> insert into t1 values (1,1000); 
  1 row created. 
  SQL> insert into t1 values (2,1500); 
  1 row created. 
  SQL> commit; 
  SQL> insert into t1 values (3,200); 
  insert into t1 values (3,200) 
  * 
  ERROR at line 1: 
  ORA-02291: integrity constraint (SYS.T_FK) violated - parent key not found 
  (違反了constraint,員工基本資料表根本沒有3號這個員工,何來的銷售紀錄。) 
SQL> drop table t; 
  drop table t 
  * 
  ERROR at line 1: 
  ORA-02449: unique/primary keys in table referenced by foreign keys 
  (違反了constraint,員工銷售表t1有參照到table t,這個reference relation不允許你drop table t) 
  SQL> drop table t cascade constraints; 
  Table dropped. 
  SQL> select * from t1; 
  ID SAL 
  ---------- ---------- 
  1 1000 
  2 1500 
  SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = #39;SYS' and TABLE_NAME = 'T1' 
  no rows selected 
  SQL> 
  我們可以發現利用Drop table cascade constraints可以以刪除關聯table t的constraint來達成你drop table t的目的,原來屬於t1的foreign key constraint已經跟隨着被刪除掉了,但是,儲存在table t1的資料可不會被刪除,也就是說Drop table cascade constraints 是不影響到存儲於objec裏的row data。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章