Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL грешка „Родителският ключ не е намерен“ за неправилно използвани външни ключове?

За съжаление (за вашия DDL код) трябва да се съглася с @William Robertson - трябва да промените модела си и по този начин трябва да преработите напълно своя DDL код. Причините за това са следните:

Разглеждайки модел с обратно проектиране, от вашия оригинален DDL код, можем да видим, че REQUISITION има 3 (съжалявам, 4) родителски таблици. Ето защо неговите вмъквания винаги се провалят, поради нарушения на външния ключ. Вашият модел:

Опростен пример, илюстриращ проблема под формата на DDL код, може да изглежда така:

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

И така, с попълнените родителски таблици, само бърза проверка:

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 

Всичко е наред. Сега искаме да вмъкнем няколко реда в дъщерната ни таблица.

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

Виждате, че правилната родителска таблица не се „избира автоматично“.

В модела на Уилям OTOH, REQUISITION има само един родител (таблица) по отношение на "доставките". Което трябва да направи вмъкването на редове много по-лесно ... вижте по-долу.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не се появява начална страница на Oracle 10g express

  2. SQL - Непълно комбиниране

  3. Променете заглавието на страница въз основа на елемент в Oracle APEX 4.0

  4. Низ за връзка на Oracle без файл tnsnames.ora

  5. ORA-12516, TNS:слушателят не можа да намери наличен манипулатор