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'”
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 wner = #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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20802110/viewspace-704367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE 中ROWNUM用法總結!Oracle
- ORACLE 中ROWNUM用法總結Oracle
- ORACLE 中ROWNUM用法總結! (轉)Oracle
- Hibernate的cascade總結
- oracle hints用法總結Oracle
- java中的HashMap用法總結JavaHashMap
- oracle臨時表的用法總結Oracle
- ORACLE 繫結變數用法總結Oracle變數
- Oracle臨時表的用法總結FLOracle
- oracle 體系 & hints的用法總結(轉)Oracle
- oracle下interval型別的用法總結Oracle型別
- Oracle中的時間函式用法(to_date、to_char) (總結)Oracle函式
- Bootstrap中的datetimepicker用法總結boot
- Linux中epoll用法總結Linux
- Oracle中的臨時表用法彙總Oracle
- ORACLE中impdp的總結Oracle
- ORACLE中的EXPDP總結Oracle
- Python numpy中矩陣的用法總結Python矩陣
- jquery中return,break,continue的用法總結jQuery
- type的用法總結
- sqlldr的用法總結SQL
- C++中const用法總結C++
- ORACLE CASCADE DATAGUARDOracle
- git在工作中的用法總結-使用篇Git
- Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法總結jQueryJSON
- Oracle中with的用法Oracle
- python 中 print 函式用法總結Python函式
- pandas用法總結
- layui用法總結UI
- less用法總結
- Promise用法總結Promise
- sed用法總結
- Autotrace 用法總結
- Oracle中drop user和drop user cascade的區別Oracle
- oracle中Alter system 命令的總結Oracle
- JS中的call()方法和apply()方法用法總結JSAPP
- HTML中Progress標籤的定義及用法總結!HTML
- 標準 C++ 中的 string 類的用法總結C++