Oracle

Oracle 父子移動失敗

  • December 25, 2021

我有兩個表,一個父表和一個子表,它們在兩個表之間聲明了引用完整性,並嘗試移動這兩個表,以便我可以刪除行。

我從子表開始,移動工作正常,行被刪除。然後我嘗試在父表上移動,移動失敗。

我可以刪除外鍵並完成父表上的移動,從而使父表和子表中的行數相同,這是我所期望的。

我不明白為什麼父表上的移動失敗,因為沒有子引用。

我發現有趣的是,如果我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 引用的表使用過濾條件。

來自Oracle 文件

具有由啟用的外鍵引用的主鍵或唯一鍵的表不支持篩選條件。

它失敗是因為有外鍵,而不是因為完整性:移動是 DDL,而不是 DML。

引用自:https://dba.stackexchange.com/questions/305379