Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Erro de SQL 'chave pai não encontrada' para chaves estrangeiras usadas incorretamente?


Infelizmente (para o seu código DDL), tenho que concordar com @William Robertson - você precisa alterar seu modelo e, portanto, precisa retrabalhar seu código DDL completamente. As razões para isso são as seguintes:

Olhando para um modelo de engenharia reversa, do seu código DDL original, podemos ver que REQUISITION tem 3 (desculpe, 4) tabelas pai. É por isso que suas inserções sempre falham, devido a violações de chave estrangeira. Seu modelo:



Um exemplo simplificado, ilustrando o problema em forma de código DDL, poderia ser algo assim:
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 ;
/

Então, com nossas tabelas pai preenchidas, apenas uma verificação rápida:
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 

Tudo certo. Agora queremos inserir algumas linhas em nossa tabela filha.
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

Você vê que a tabela pai correta não apenas "é escolhida automaticamente".

No modelo OTOH de William, REQUISITION tem apenas um pai (tabela) com relação a "suprimentos". O que deve facilitar muito a inserção de linhas ... veja abaixo.