Oracle
 sql >> Database >  >> RDS >> Oracle

Errore SQL "Chiave principale non trovata" per chiavi esterne utilizzate in modo improprio?

Sfortunatamente (per il tuo codice DDL) devo essere d'accordo con @William Robertson:devi cambiare il tuo modello e, quindi, devi rielaborare completamente il tuo codice DDL. Le ragioni di ciò sono le seguenti:

Osservando un modello di reverse engineering, dal tuo codice DDL originale, possiamo vedere che REQUISITION ha 3 (scusate, 4) tabelle padre. Ecco perché i suoi inserti falliscono sempre, a causa di violazioni della chiave esterna. Il tuo modello:

Un esempio semplificato, che illustra il problema sotto forma di codice DDL, potrebbe assomigliare a questo:

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 ;
/

Quindi, con le nostre tabelle padre popolate, solo un rapido controllo:

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 

Tutto bene. Ora vogliamo inserire alcune righe nella nostra tabella figlio.

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

Vedi che la tabella padre corretta non viene semplicemente "prelevata automaticamente".

Nel modello OTOH di William, REQUISITION ha un solo genitore (tabella) rispetto alle "forniture". Il che dovrebbe rendere l'inserimento delle righe molto più semplice... vedi sotto.