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

2021-12-30 05:57:57 字數 2747 閱讀 8326

一、級聯刪除

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...