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

小議Oracle外鍵約束修改行為(一)

2013-11-13 15:54:21  來源: Oracle 

  Oracle的外鍵用來限制子表中參考的字段的值必須在主表中存在而且在主表的記錄發生變化導致外鍵參考唯一約束值發生了變化時定義了一系列的動作

  在SQL標准中定義了幾種外鍵改變後如何處理子表記錄的動作其中包括

  限制Restrict這種方式不允許對被參考的記錄的鍵值執行更新或刪除的操作置為空Set to null當參考的數據被更新或者刪除那麼所有參考它的外鍵值被置為空

  置為默認值Set to default當參考的數據被更新或者刪除那麼所有參考它的外鍵值被置為一個默認值

  級聯Cascade當參考的數據被更新則參考它的值同樣被更新當參考的數據被刪除則參考它的子表記錄也被刪除

  不做操作No action這種方式不允許更新或刪除被參考的數據和限制方式的區別在於這種方式的檢查發生在語句執行之後Oracle默認才會的方式就是這種方式

  Oracle明確支持的方式包括No actionSet to null和Cascade對於Set to Default和RestrictOracle的約束類型並不直接支持不過可以通過觸發器來實現

  簡單看一下Oracle的默認處理方式No action

  

  SQL> CREATE TABLE T_P (ID NUMBER NAME VARCHAR());

  表已創建

  SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);

  表已更改

  SQL> CREATE TABLE T_C (ID NUMBER FID NUMBER NAME VARCHAR());

  表已創建

  SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C
FOREIGN KEY (FID)
REFERENCES T_P (ID);

  表已更改

  SQL> INSERT INTO T_P VALUES ( A);

  已創建

  SQL> INSERT INTO T_P VALUES ( B);

  已創建

  SQL> INSERT INTO T_C VALUES ( A);

  已創建

  SQL> COMMIT;

  提交完成

  對於No Action操作而言如果主鍵的記錄被外鍵所參考那麼主鍵記錄是無法更新或刪除的

  SQL> DELETE T_P WHERE ID = ;
DELETE T_P WHERE ID =
*第 行出現錯誤:
ORA: 違反完整約束條件 (YANGTKFK_T_C) 已找到子記錄日志

  SQL> UPDATE T_P SET ID = WHERE ID = ;
UPDATE T_P SET ID = WHERE ID =
*第 行出現錯誤:
ORA: 違反完整約束條件 (YANGTKFK_T_C) 已找到子記錄日志

  SQL> DELETE T_P WHERE ID = ;

  已刪除

  不過No Action又和Restrict操作有所區別No Action允許用戶執行語句在語句執行之後或者事務結束的時候才會檢查是否違反約束而Restrict只有檢測到有外鍵參考主表的記錄就不允許刪除和更新的操作執行了

  這也使得No Action操作支持延遲約束

  SQL> ALTER TABLE T_C DROP CONSTRAINT FK_T_C;

  表已更改

  SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C
FOREIGN KEY (FID)
REFERENCES T_P (ID)
DEFERRABLE INITIALLY DEFERRED;

  表已更改

  SQL> SELECT * FROM T_P;

  ID NAME

A

  SQL> SELECT * FROM T_C;

  ID FID NAME

A

  SQL> DELETE T_P WHERE ID = ;

  已刪除

  SQL> INSERT INTO T_P VALUES ( A);

  已創建

  SQL> COMMIT;

  提交完成


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