2013-05-09 32 views
0

我创建的对象类型和VARRAY:如何是一个Oracle SQL对象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_ADAT对象的termek_id字段作为此表的外键:

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

我不知道我怎么能意识到这一点。 感谢hep。

回答

0

你不能建立这样的约束。

的解决方法是标准化的架构,并有termek_adat ,这是与您的当前类型,但与外键回到其父埃拉德行:

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和关系世界中,你应该扭转面向对象的世界里,家长有孩子的名单正常的父子关系,而是关系中的子引用父。通过试图在Elad(父母)中存储VARRAY(孩子),你遇到了你所问的参考完整性问题。

是的,你将不得不加入adat的Elad,但没关系,和SQL的方式。 --D

PS:注意termek_adat上的复合主键,它引用父Elad和termek_id,因为对于给定的Elad,可能有几次相同的termek_id可能没有意义。

相关问题