Oracle外鍵約束的三種刪除行為小結(jié)
Oracle外鍵約束的三種刪除行為分別是:默認(rèn)刪除(No Action)、級(jí)聯(lián)刪除(Cascade)和置空刪除(Set Null)。這三種行為定義了當(dāng)主表(父表)中的記錄被刪除時(shí),子表中對(duì)應(yīng)外鍵的處理方式。
1、創(chuàng)建主表及子表并初始化數(shù)據(jù)
1.1、創(chuàng)建主表t_parent,并插入三條記錄
hr@orcl> create table t_parent (parent_id int primary key, name varchar2(10));
hr@orcl> insert into t_parent values (1,'record1');
hr@orcl> insert into t_parent values (2,'record2');
hr@orcl> insert into t_parent values (3,'record3');
hr@orcl> commit;
hr@orcl> select * from T_PARENT;
PARENT_ID NAME
---------- ------------------------------
1 record1
2 record2
3 record3
1.2、創(chuàng)建字表外鍵約束默認(rèn)刪除no action類型
hr@orcl> create table t_child1 (child1_id int primary key, parent_id int);
hr@orcl> alter table t_child1 add constraint FK_t_child1 foreign key (parent_id) references t_parent (parent_id);
hr@orcl> insert into t_child1 values (1,1);
hr@orcl> commit;
hr@orcl> select * from T_CHILD1;
CHILD1_ID PARENT_ID
---------- ----------
1 1
1.3、創(chuàng)建字表外鍵約束級(jí)聯(lián)刪除(Cascade)
hr@orcl> create table t_child2 (child2_id int primary key, parent_id int);
hr@orcl> alter table t_child2 add constraint FK_t_child2 foreign key (parent_id) references t_parent (parent_id) on delete cascade;
hr@orcl> insert into t_child2 values (2,2);
hr@orcl> commit;
hr@orcl> select * from T_CHILD2;
CHILD2_ID PARENT_ID
---------- ----------
2 2
1.4、創(chuàng)建字表外鍵約束置空刪除(Set Null)
hr@orcl> create table t_child3 (child2_id int primary key, parent_id int);
hr@orcl> alter table t_child3 add constraint FK_t_child3 foreign key (parent_id) references t_parent (parent_id) on delete set null;
hr@orcl> insert into t_child3 values (3,3);
hr@orcl> commit;
hr@orcl> select * from T_CHILD3;
CHILD2_ID PARENT_ID
---------- ----------
3 3
2、三種刪除行為
2.1、默認(rèn)刪除(No Action)
行為描述:
- 當(dāng)在定義外鍵約束時(shí)使用No Action關(guān)鍵字(或者什么都不加,因?yàn)镹o Action是默認(rèn)值),如果嘗試刪除主表中被外鍵引用的記錄,Oracle將阻止這一操作,并返回錯(cuò)誤,因?yàn)檫@將違反外鍵約束的完整性。
示例:
如果嘗試刪除主表T_PARENT中PARENT_ID為1的記錄,而子表T_CHILD1中存在引用該PARENT_ID的記錄,則刪除操作將失敗,并返回類似ORA-02292: integrity constraint (FK_T_CHILD1) violated - child record found的錯(cuò)誤。
hr@orcl> delete from T_PARENT where parent_id = 1;
delete from T_PARENT where parent_id = 1
*
ERROR at line 1:
ORA-02292: integrity constraint (SEC.FK_T_CHILD1) violated - child record found
hr@orcl> select * from T_CHILD1;
CHILD1_ID PARENT_ID
---------- ----------
1 1
在此類型下,不允許刪除。
2.2、級(jí)聯(lián)刪除(Cascade)
行為描述:
- 當(dāng)在定義外鍵約束時(shí)使用Cascade關(guān)鍵字,如果主表中被引用的記錄被刪除,那么子表中所有引用該記錄的外鍵也將被自動(dòng)刪除。
示例:
如果主表T_PARENT中PARENT_ID為2的記錄被刪除,并且子表T_CHILD2中存在引用該PARENT_ID的記錄,則這些記錄也將被自動(dòng)刪除,以保持?jǐn)?shù)據(jù)的一致性。
hr@orcl> delete from T_PARENT where parent_id = 2; 1 row deleted. hr@orcl> select * from T_CHILD2; no rows selected 成功,級(jí)聯(lián)刪除成功。
2.3、 置空刪除(Set Null)
行為描述:
- 當(dāng)在定義外鍵約束時(shí)使用Set Null關(guān)鍵字,如果主表中被引用的記錄被刪除,那么子表中所有引用該記錄的外鍵將被設(shè)置為NULL。注意,這要求子表中的外鍵列允許NULL值。
示例:
如果主表T_PARENT中PARENT_ID為3的記錄被刪除,并且子表T_CHILD3中存在引用該PARENT_ID的記錄,則這些記錄中的PARENT_ID將被設(shè)置為NULL。
hr@orcl> delete from T_PARENT where parent_id = 3;
1 row deleted.
hr@orcl> select * from T_CHILD3;
CHILD2_ID PARENT_ID
---------- ----------
3
主表記錄可以完成刪除,子表中對(duì)應(yīng)的內(nèi)容被設(shè)置為NULL。
3、 總結(jié)
以上就是在Oracle數(shù)據(jù)庫,當(dāng)主表信息刪除后對(duì)應(yīng)的子表中記錄的三種不同的處理方式,針對(duì)具體的應(yīng)用場(chǎng)合請(qǐng)選擇合適類型。
Oracle外鍵約束的三種刪除行為為數(shù)據(jù)庫設(shè)計(jì)提供了靈活性,可以根據(jù)實(shí)際需求選擇合適的行為來維護(hù)數(shù)據(jù)的完整性和一致性。在實(shí)際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)的依賴關(guān)系和業(yè)務(wù)邏輯來選擇合適的刪除行為。
以上信息基于Oracle數(shù)據(jù)庫的外鍵約束行為,并參考了相關(guān)的技術(shù)文檔和博客文章。需要注意的是,隨著Oracle數(shù)據(jù)庫版本的更新,某些細(xì)節(jié)和語法可能會(huì)有所變化,因此建議查閱最新的官方文檔以獲取最準(zhǔn)確的信息。
到此這篇關(guān)于Oracle外鍵約束的三種刪除行為小結(jié)的文章就介紹到這了,更多相關(guān)Oracle外鍵約束刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle中幾種常見的數(shù)據(jù)庫錯(cuò)誤類型及處理方法
處理常見的數(shù)據(jù)庫錯(cuò)誤是數(shù)據(jù)庫管理的重要組成部分,以下是幾種常見的數(shù)據(jù)庫錯(cuò)誤類型及其處理方法,結(jié)合具體代碼示例,以幫助你更好地解決這些問題,感興趣的小伙伴跟著小編一起來看看吧2024-09-09
Oracle?查詢語句限制只選擇最前面幾行和最后面幾行的實(shí)現(xiàn)方式
在Oracle中,可以使用?ROWNUM?關(guān)鍵字來限制查詢結(jié)果的行數(shù),這篇文章主要介紹了Oracle?查詢語句限制只選擇最前面幾行和最后面幾行的實(shí)現(xiàn)方式,需要的朋友可以參考下2023-12-12
如何解決ORA-01843與NLS_DATE_FORMAT問題
本文將詳細(xì)介紹如何解決ORA-01843與NLS_DATE_FORMAT問題,需要的朋友可以參考下2012-11-11
Oracle中的半聯(lián)結(jié)和反聯(lián)結(jié)詳解
這篇文章主要介紹了Oracle中的半聯(lián)結(jié)和反聯(lián)結(jié)詳解,也稱半連接和反連接,其實(shí)就是in、exists,需要的朋友可以參考下2014-07-07
Oracle怎么刪除數(shù)據(jù),Oracle數(shù)據(jù)刪除的三種方式
這篇文章主要介紹了Oracle中刪除數(shù)據(jù)的三種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
oracle?delete誤刪除表數(shù)據(jù)后如何恢復(fù)
最近在使用oracle數(shù)據(jù)時(shí),一不小心把table中的數(shù)據(jù)delete掉并且已經(jīng)提交了,下面這篇文章主要給大家介紹了關(guān)于oracle?delete誤刪除表數(shù)據(jù)后如何恢復(fù)的相關(guān)資料,需要的朋友可以參考下2022-06-06
Oracle創(chuàng)建用戶與表空間的絕對(duì)干貨(建議收藏)
在JAVAEE工程當(dāng)中時(shí)常用的Oracle數(shù)據(jù)庫,作為一名后臺(tái)程序開發(fā)人員,掌握如何在Oracle創(chuàng)建用戶,表空間是一項(xiàng)必備的技能,下面這篇文章主要給大家介紹了關(guān)于Oracle創(chuàng)建用戶與表空間的相關(guān)資料,需要的朋友可以參考下2022-09-09

