熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

如何在Oracle中用非默認方式創建外鍵

2022-06-13   來源: Oracle 

  創建外鍵約束時如果使用Oracle默認的創建方式在刪除被參照的數據時將無法被刪除這一點在Oraclei中給了我們更多靈活的選擇我們可是使用on delete cascade和 on delete set null關鍵字來決定刪除被參照數據時是否要將參照這個數據的那些數據一並刪除還是將那些參照這條數據的數據的對應值賦空

  例如下面這兩個表中分別存的時員工的基本信息和公司的部門信息我們為

  
  create table dept
  (deptno number() not null
  deptname varchar() not null
  constraint pk_dept primary key(deptno));

  和

  
  create table emp
  ( empno number() not null
  fname varchar() 
  lname varchar() 
  dept number() 
  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(銷售部);
  insert into dept values(財務部);
  insert into emp values (MarySong);
  insert into emp values (LindaLiu);
  insert into emp values (LinlinZhang);

  然後現在我要刪除銷售部會有什麼後果呢?

  
  delete from dept where deptno = ;

  我們發現除了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 = ;

  你也會發現除了dept中的銷售部被刪除以外emp中參照這條數據的兩條數據的dept的值被自動賦空了這就是on delete set null的作用了

  使用on delete set null有一點需要注意的是被參參照其他表的那一列必須能夠被賦空不能有not null約束對於上面的例子來說是emp中dept列一定不能有not null約束如果已經定義了not null約束又使用了on delete set null來刪除被參照的數據時將會發生ORA: 無法更新 (DDEMPDEPT) 為 NULL的錯誤

  總的來講on delete cascade和on delete set null的作用是用來處理級聯刪除問題的如果你需要刪除的數據被其他數據所參照那麼你應該決定到底希望oracle怎麼處理那些參照這些即將要刪除數據的數據的你可以有三種方式

  禁止刪除這也是Oracle默認的

  將那些參照本值的數據的對應列賦空這個需要使用on delete set null關鍵字

  將那些參照本值的數據一並刪除這個需要使用on delete cascade關鍵字


From:http://tw.wingwit.com/Article/program/Oracle/201311/16577.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.