Как понять, что элементы Oracle SQL OBJECT VARRAY используют в качестве внешнего ключа

Я создал тип OBJECT и VARRAY:

CREATE TYPE termek_adat IS OBJECT(
termek_id number(3), termek_db number(3));
/
CREATE type TERMEK_INF is VARRAY(10000) OF termek_adat;

Я создал таблицу:

CREATE TABLE Elad(
elad_id number(3),
termek_i TERMEK_INF constraint elad_ref_term_fk references termek(termek_id),
faktura_id number(3),
datum timestamp,
constraint e_pk_key primary key(elad_id)
);

есть VARRAY termek_i. Я хочу использовать поле termek_id объектов TERMEK_ADAT в качестве внешнего ключа к этой таблице:

CREATE TABLE Termek
  (termek_id NUMBER(3) CONSTRAINT term_term_id_pk PRIMARY KEY,
  megnevezes VARCHAR2(50),
  termek_kod NUMBER(15),
  termek_ar NUMBER(5),
  db_uzlet NUMBER(3),
  db_raktar NUMBER(3),
  szallito_id NUMBER(3) CONSTRAINT term_term_fk REFERENCES Szallitok(szallito_id) );

Я не знаю, как я могу это понять. Спасибо за гепатит.

1 ответ

Вы не можете установить такое ограничение.

Решение состоит в том, чтобы нормализовать вашу схему и получить таблицу termek_adat, которая совпадает с вашим текущим типом, но с внешним ключом возвращается к родительской строке Elad:

CREATE TABLE termek_adat (
  elad_id number(3) references Elad(elad_id),
  termek_id number(3) references Termek(termek_id),
  termek_db number(3),
  primary key (elad_id, termek_id)
);

В основном, в SQL и реляционном мире вы должны изменить нормальные отношения родитель-потомок в объектно-ориентированном мире, где у родителя есть список его дочерних элементов, а вместо этого в Relational дочерний элемент ссылается на родителя. Пытаясь сохранить VARRAY (дочерние элементы) в Elad (родительском), вы сталкиваетесь с проблемой ссылочной целостности, о которой вы спрашиваете.

Да, вам нужно будет присоединиться, чтобы получить адаты данного Elad, но это нормально, и способ SQL. --DD

PS: Обратите внимание на составной первичный ключ в termek_adat, который ссылается как на родительский Elad, так и на termek_id, поскольку, вероятно, не имеет смысла иметь несколько раз один и тот же termek_id для данного Elad.

Другие вопросы по тегам