sql >> Base de Datos >  >> RDS >> Oracle

¿Error de SQL 'Clave principal no encontrada' para claves foráneas utilizadas incorrectamente?

Desafortunadamente (para su código DDL), tengo que estar de acuerdo con @William Robertson:debe cambiar su modelo y, por lo tanto, debe volver a trabajar su código DDL por completo. Las razones para esto son las siguientes:

Mirando un modelo de ingeniería inversa, desde su código DDL original, podemos ver que REQUISICIÓN tiene 3 (perdón, 4) tablas principales. Es por eso que sus inserciones siempre fallan, debido a violaciones de clave externa. Tu modelo:

Un ejemplo simplificado, que ilustra el problema en forma de código DDL, podría verse así:

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

Entonces, con nuestras tablas principales llenas, solo una revisión 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 

Todo está bien. Ahora queremos insertar algunas filas en nuestra tabla secundaria.

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

Verá que la tabla principal correcta no solo "se elige automáticamente".

En el modelo OTOH de William, REQUISITION tiene solo un padre (tabla) con respecto a los "suministros". Lo que debería facilitar mucho la inserción de filas... ver más abajo.