Oracle系列 級聯刪除和級聯更新

2022-01-16 14:51:46 字數 3487 閱讀 2001

必須宣告:此部落格**於oracle外來鍵級聯刪除和級聯更新

鑑於此前收藏的精彩部落格無料被刪除了,很是痛心,所以還是要複製一下

一、級聯刪除

oracle在外鍵的刪除上有no action(類似restrict)、cascade和set null三種行為。

下面以學生-班級為例說明不同情況下的外來鍵刪除,學生屬於班級,班級的主鍵是學生的外來鍵。

1

--班級表

2 crate table

tb_class3(

4 id number

notnull, --

班級主鍵

5 name varchar2(50), --

班級名稱

6constraint pk_tb_class primary

key(id)7);

89--學生表

10create

table

tb_student11(

12 id number

notnull, --

學生主鍵

13 name varchar2(50), --

學生姓名

14 class_id number, --

學生所屬班級,外來鍵

1516

--主鍵約束

17constraint pk_tb_student primary

key(id),

1819

--外來鍵約束

20--

設定級聯刪除為no action

21constraint fk_tb_student_class_id foreign

key (class_id) references

tb_class (id)

22);

2324

--新增班級資料

25insert

into tb_class (id, name) values (1, '一班'

);26

insert

into tb_class (id, name) values (2, '二班'

);27

insert

into tb_class (id, name) values (3, '三班'

);28

29--

新增學生資料

30insert

into tb_student (id, name, class_id) values (1, '

小明', 1

);31

insert

into tb_student (id, name, class_id) values (2, '

小剛', 1

);32

insert

into tb_student (id, name, class_id) values (3, '

小王', 1

);33

insert

into tb_student (id, name, class_id) values (4, '

二明', 2

);34

insert

into tb_student (id, name, class_id) values (5, '

二剛', 2

);35

insert

into tb_student (id, name, class_id) values (6, '

二王', 2

);36

insert

into tb_student (id, name, class_id) values (7, '

大明', 3

);37

insert

into tb_student (id, name, class_id) values (8, '

大剛', 3

);38

insert

into tb_student (id, name, class_id) values (9, '

大王', 3);

1、no action

no action指當刪除主表中被引用列的資料時,如果子表的引用列中包含該值,則禁止該操作執行。

現在學生外來鍵級聯刪除是no action,執行刪除班級操作。

2、set null

set null指當刪除主表中被引用列的資料時,將子表中相應引用列的值設定為null值。set null有個前提就是外來鍵引用列必須可以設定為null。

把學生表(tb_student)的外來鍵刪除行為改為set null。oracle似乎沒有modify constraint操作,只能先刪除外來鍵,然後建立新的。

3、cascade

cascade指當刪除主表中被引用列的資料時,級聯刪除子表中相應的資料行。

把學生表(tb_student)的外來鍵刪除行為改為cascade。

二、級聯更新

oracle本身並不支援外來鍵的級聯更新,不過可以按照如下方法達到級聯更新的效果。

首先要先了解oracle延遲約束和非延遲約束。非延遲約束就是在修改記錄的時候會立刻進行約束條件的檢視,是否因為違反了某些約束條件而不能執行修改。延遲約束不會在剛進行修改的時候進行約束檢視,只有提交的時候才會檢查。oracle的級聯更新就是使用這個特性來實現的。

oracle的外來鍵預設是非延遲約束,修改學生的外來鍵為延遲約束。

1

--刪除學生表(tb_student)上的已有外來鍵

2alter

table tb_student drop

constraint

fk_tb_student_class_id;3--

新增延遲約束外來鍵

4alter

table tb_student add

constraint fk_tb_student_class_id foreign

key (class_id) references tb_class (id) on

delete

cascade deferrable;

設定觸發器,當班級表(tb_class)的主鍵改變了,就更新學生表(tb_student)的外來鍵(class_id)。

1

create

orreplace

trigger

tgr_tb_class_update

2 after update

of id on

tb_class

3for

each row

4begin

5if :old.id<>:new.id then

6update tb_student set class_id=:new.id where class_id=

:old.id;

7endif;

8end;

oracle系列基礎之級聯刪除和級聯更新

一 級聯刪除 oracle在外鍵的刪除上有no action 類似restrict cascade和set null三種行為。下面以學生 班級為例說明不同情況下的外來鍵刪除,學生屬於班級,班級的主鍵是學生的外來鍵。班級表 crate table tb class id number not null...

oracle 級聯刪除

1 查詢外來鍵及父表 select a.constraint name 外鍵名,a.table name 子表,b.table name 父表 from user constraints a,user constraints b where a.constraint type r and b.con...

oracle級聯刪除

oracle中使用on delete cascade和on delete set null來建立外來鍵 其面我們介紹了建立外來鍵約束時如果使用oracle預設的建立方式,在刪除被參照的資料時,將無法被刪除,這一點在oracle9i中給了我們更多靈活的選擇,我們可是使用on delete cascad...