sql >> Databáze >  >> RDS >> Oracle

Chyba SQL „Nadřazený klíč nebyl nalezen“ pro nesprávně použité cizí klíče?

Bohužel (pro váš kód DDL) musím souhlasit s @William Robertsonem - musíte změnit svůj model, a proto musíte svůj kód DDL úplně přepracovat. Důvody jsou následující:

Když se podíváme na model reverzně inženýrství, z vašeho původního kódu DDL, můžeme vidět, že REQUISITION má 3 (pardon, 4) nadřazené tabulky. To je důvod, proč jeho vložky vždy selžou, kvůli porušení cizího klíče. Váš model:

Zjednodušený příklad, ilustrující problém ve formě kódu DDL, by mohl vypadat nějak takto:

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že s naplněnými nadřazenými tabulkami jen rychlá kontrola:

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 

Vše dobré. Nyní chceme vložit několik řádků do naší podřízené tabulky.

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

Vidíte, že správná nadřazená tabulka se „nevybere automaticky“.

Ve Williamově modelu OTOH má REQUISITION pouze jednoho rodiče (tabulku) s ohledem na "zásoby". Což by mělo vkládání řádků značně usnadnit... viz níže.



  1. Zdá se, že nemohu připojit svou stránku PHP k testovacímu serveru SQL a databázi

  2. Odstraňte duplikáty z výsledků Count() v SQLite

  3. Zašifrujte data v postgresql

  4. MySQL:Získejte návratový výsledek z INSERT SELECT