關於delete cascade的小實驗

exbean發表於2009-12-22

關於delete cascade的小實驗

建立用於測試的三張表test_a,test_b,test_c
create table test_a(id int not null, fk int, constraint pk primary key(id));
create table test_b(id int not null, fk int, constraint pe primary key(id));
create table test_c(id int not null, fk int, constraint pr primary key(id));

ID主鍵,在FK列上建立外來鍵

插入測試資料
insert into test_a values(1,11);
insert into test_a values(2,22);
insert into test_b values(11,1);
insert into test_b values(22,2);
insert into test_c values(111,11);
insert into test_c values(222,22);

commit;

在test_b和test_c上建立外來鍵約束
alter table test_b add constraint fk_test_b foreign key (fk) references test_a(id) on delete cascade;

alter table test_c add constraint fk_test_c foreign key (fk) references test_b(id) on delete cascade;

從test_a級聯刪除id為1的行
delete from test_a where id=1;
成功

需要說明的是
1、如果僅僅在test_b上建立 on delete cascade 選項,則會出現在test_c上無法刪除的情況,因此不能成功
2、在測試過程中,如果使用truncate截斷test_a,或者test_b會出現orc-02266的情況,必須使用alter table test_b disable constraint fk_test_b;
alter table test_b disable primary key; 但是在此時會出現另一個錯誤,ora-02297,因為test_c的fk_test_c依賴test_b(id)主鍵,因此需要先
alter table test_c disable constrait fk_test_c;
3、查閱相關的資料發現Oracle沒有on update cascad 選項,參閱

外來鍵作為資料庫參照完整性的原則,其目的就是為了使相關聯的表之間保證完整,如建立約束時沒有指定on delete cascade 選項,則應該從子表依次刪除以保證參照實體的完整,如果未指定,預設應該是NO ACTION;

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9236282/viewspace-1029890/,如需轉載,請註明出處,否則將追究法律責任。

相關文章