Как понять, что элементы 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.