建立外來鍵(FK) 以及Oracle9i中三種處理級聯刪除資料的方式
建立外來鍵約束時如果使用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)) ;
一般Oracle預設建立FK 是這樣的:
alter table emp add constraint fk_emp_dept foreign key(dept) references dept(deptno) ;
這樣在刪除dept中的一個deptno 的時候 (假設這個單位deptno解散,不復存在), 就會報錯,因為emp表中有外來鍵參照dept中的deptno . 當然如果emp 表中的所有關於這個deptno 的行都已經刪除,那麼再來刪除dept中的這個deptno行還是可以的。
然後我們現在分別使用這兩個關鍵字來增加外來鍵試一下,首先我們來試一下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 empadd 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預設的方式,特殊情況下會選擇下面兩種 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-605323/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 外來鍵的級聯處理Oracle
- 快速刪除有外來鍵關聯的資料庫的資料資料庫
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- 在MySQL中利用外來鍵實現級聯刪除(轉)MySql
- 如何批量使外來鍵(FK)失效
- mysql中外來鍵約束級聯更新與刪除MySql
- Saas模式資料庫層資料架構以及資料刪除處理 (轉)模式資料庫架構
- 【fk_index】外來鍵中有無索引的區別Index索引
- 大資料三種處理方式大資料
- SQL刪除資料庫裡所有表的外來鍵,同時刪除所有使用者表SQL資料庫
- cad刪除快捷鍵命令 cad刪除有幾種方式
- 級聯刪除
- mysql 刪除老是報外來鍵約束MySql
- 海量資料處理_刪除重複行
- MongoDB 資料庫建立刪除、表(集合)建立刪除、資料增刪改查MongoDB資料庫
- 【Foreign Key】Oracle外來鍵約束三種刪除行為Oracle
- Oracle非關鍵資料檔案作業系統誤刪除處理Oracle作業系統
- Oracle外來鍵約束中NULL的處理OracleNull
- SQL Server實戰二:建立、修改、複製、刪除資料庫表並加以資料處理SQLServer資料庫
- LoadRunner中多值關聯的3種處理方式
- 【Oracle故障處理】-Oracle9i臨時表空間刪除重建Oracle
- MongoDB中優雅刪除大量資料的三種方式純尹MongoDB
- 表外來鍵未加索引之處理索引
- PostgreSQL:資料庫的建立與刪除SQL資料庫
- oracle中的級聯刪除(轉)Oracle
- 檢視oracle 資料庫中的級聯刪除(delete cascade)Oracle資料庫delete
- sql觸發器刪除資料庫中的級聯記錄SQL觸發器資料庫
- 處理百萬級以上的資料處理
- 外來鍵刪除(T-SQL Drop Foreign Key)SQL
- oracle中查詢、禁用、啟用、刪除表外來鍵Oracle
- [MYSQL] 資料庫建立與刪除MySql資料庫
- 刪除或清空具有外來鍵約束的表資料包-ERROR 1701 (42000)Error
- 如果新增欄位是外來鍵,如何處理?
- 手工建立/刪除資料庫的步驟資料庫
- 遷移後處理外來鍵約束的問題
- Laravel指東:使用模型建立 uuid 主鍵資料的兩種方式Laravel模型UI
- mysql 建立和刪除聯合索引MySql索引
- oracle 誤刪除的處理方法Oracle