一、級聯刪除
oracle在外鍵的刪除上有no action(類似restrict)、cascade和set null三種行為。
下面以學生-班級為例說明不同情況下的外來鍵刪除,學生屬於班級,班級的主鍵是學生的外來鍵。
-- 班級表
crate table tb_class
( id number not null, --班級主鍵
name varchar2(50), --班級名稱
constraint pk_tb_class primary key (id));
-- 學生表
create table tb_student
( id number not null, --學生主鍵
name varchar2(50), --學生姓名
class_id number, --學生所屬班級,外來鍵
--主鍵約束
constraint pk_tb_student primary key (id),
--外來鍵約束
--設定級聯刪除為no action
constraint fk_tb_student_class_id foreign key (class_id) references tb_class (id));
-- 新增班級資料
insert into tb_class (id, name) values (1, '一班');
insert into tb_class (id, name) values (2, '二班');
insert into tb_class (id, name) values (3, '三班');
-- 新增學生資料
insert into tb_student (id, name, class_id) values (1, '小明', 1);
insert into tb_student (id, name, class_id) values (2, '小剛', 1);
insert into tb_student (id, name, class_id) values (3, '小王', 1);
insert into tb_student (id, name, class_id) values (4, '二明', 2);
insert into tb_student (id, name, class_id) values (5, '二剛', 2);
insert into tb_student (id, name, class_id) values (6, '二王', 2);
insert into tb_student (id, name, class_id) values (7, '大明', 3);
insert into tb_student (id, name, class_id) values (8, '大剛', 3);
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)上的已有外來鍵
2 alter table tb_student drop constraint fk_tb_student_class_id;
3 --新增延遲約束外來鍵
4 alter table tb_student add constraint fk_tb_student_class_idforeign key (class_id) references tb_class (id) on delete cascade deferrable;設定觸發器,當班級表(tb_class)的主鍵改變了,就更新學生表(tb_student)的外來鍵(class_id)。
create or replace trigger tgr_tb_class_update
after update of id on tb_class
for each row
begin
if :old.id<>:new.id then
update tb_student set class_id=:new.id where class_id=:old.id;
end if;
end;
Oracle系列 級聯刪除和級聯更新
必須宣告 此部落格 於oracle外來鍵級聯刪除和級聯更新 鑑於此前收藏的精彩部落格無料被刪除了,很是痛心,所以還是要複製一下 一 級聯刪除 oracle在外鍵的刪除上有no action 類似restrict cascade和set 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...