Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Błąd SQL „Nie znaleziono klucza nadrzędnego” dla niewłaściwie użytych kluczy obcych?

Niestety (dla twojego kodu DDL) muszę zgodzić się z @Williamem Robertsonem - musisz zmienić swój model, a co za tym idzie, musisz całkowicie przerobić swój kod DDL. Powody tego są następujące:

Patrząc na model poddany inżynierii wstecznej, z oryginalnego kodu DDL, widzimy, że REQUISITION ma 3 (przepraszam, 4) tabele nadrzędne. Dlatego jego wstawki zawsze zawodzą z powodu naruszeń klucza obcego. Twój model:

Uproszczony przykład, ilustrujący problem w postaci kodu DDL, mógłby wyglądać mniej więcej tak:

create table parent1 ( id number primary key ) ; -- analogy: supplies_pharmaceutical
create table parent2 ( id number primary key ) ; -- analogy: supplies_nonsurgical
create table parent3 ( id number primary key ) ; -- analogy: supplies_surgical

create table child ( -- analogy: requisitions
  id number primary key
, parentid number 
);

alter table child add constraint fkey_parent1
foreign key ( parentid ) references parent1 ( id ) ;

alter table child add constraint fkey_parent2
foreign key ( parentid ) references parent2 ( id ) ;

alter table child add constraint fkey_parent3
foreign key ( parentid ) references parent3 ( id ) ;

begin
  insert into parent1 ( id ) values ( 1 ) ;
  insert into parent2 ( id ) values ( 2 ) ;
  insert into parent3 ( id ) values ( 3 ) ;
end ;
/

Tak więc, gdy nasze tabele nadrzędne są wypełnione, wystarczy szybkie sprawdzenie:

select 'parent1 (id) -> ' || id from parent1
union all
select 'parent2 (id) -> ' ||  id from parent2
union all
select 'parent3 (id) -> ' ||  id from parent3
;

-- result
'PARENT1(ID)->'||ID  
parent1 (id) -> 1    
parent2 (id) -> 2    
parent3 (id) -> 3 

Wszystko dobrze. Teraz chcemy wstawić kilka wierszy do naszej tabeli podrzędnej.

insert into child ( id, parentid ) values ( 100, 1 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found

insert into child ( id, parentid ) values ( 101, 2 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found

insert into child ( id, parentid ) values ( 102, 3 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT2) violated - parent key not found

Widzisz, że właściwa tabela nadrzędna nie jest po prostu „wybierana automatycznie”.

W modelu OTOH Williama ZAPYTANIE ma tylko jednego rodzica (tablicę) w odniesieniu do „dostaw”. Co powinno znacznie ułatwić wstawianie wierszy ... patrz poniżej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekskluzywna blokada stołu (odczytu) na Oracle 10g?

  2. Jak wyodrębnić numer miesiąca od daty w Oracle

  3. Hibernate:generator identyfikatorów wykorzystujący inkrementację i schemat Oracle

  4. Wybierz opcję Zbieranie zbiorcze do przykładu Oracle

  5. Czy mogę używać IF w PL/SQL?