Oracle
Oracle 父子移動失敗
我有兩個表,一個父表和一個子表,它們在兩個表之間聲明了引用完整性,並嘗試移動這兩個表,以便我可以刪除行。
我從子表開始,移動工作正常,行被刪除。然後我嘗試在父表上移動,移動失敗。
我可以刪除外鍵並完成父表上的移動,從而使父表和子表中的行數相同,這是我所期望的。
我不明白為什麼父表上的移動失敗,因為沒有子引用。
我發現有趣的是,如果我
ON CASCADE DELETE
在父表和子表上都設置了刪除,只需在父表上刪除即可。有人可以向我解釋為什麼即使沒有子行,父級的移動也會失敗。我原以為這會奏效。
我在 Oracle 19.2 上執行,還使用 LIVESQL 對其進行了測試。下面是我的詳細測試案例。
create table parent as select * from all_objects where rownum <= 10000; alter table parent add constraint par_pk primary key(object_id); create table child as select * from parent order by dbms_random.value; alter table child add constraint chi_pk primary key(object_id); alter table child add constraint chi_fk_par foreign key(object_id) references parent;
我已經從父數據創建了子表,隨機排序。現在我將刪除所有
owner = ‘PUBLIC’
使用線上移動的子行,然後我將嘗試對父行執行相同的操作。SELECT count(*) from child COUNT(*) 10000 alter table child move including rows where owner != 'PUBLIC' online ;
子移動成功
SELECT count(*) from child COUNT(*) 4014 alter table parent move including rows where owner != 'PUBLIC' online ;
嘗試對父級進行匹配移動會導致:
ORA-02266: 表中由啟用的外鍵引用的唯一鍵/主鍵
現在,當我刪除外鍵並進行移動時,一切似乎都可以正常工作。
alter table child disable CONSTRAINT chi_fk_par; alter table parent move including rows where owner != 'PUBLIC' online ; SELECT count(*) from parent COUNT(*) 4014 alter table child enable CONSTRAINT chi_fk_par;
您正在對其 PK 由 FK 引用的表使用過濾條件。
具有由啟用的外鍵引用的主鍵或唯一鍵的表不支持篩選條件。
它失敗是因為有外鍵,而不是因為完整性:移動是 DDL,而不是 DML。