必須宣告:此部落格**於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)。
1create
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...