0

我创建了一个 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_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) );

我不知道我怎么能意识到这一点。感谢您的帮助。

4

1 回答 1

0

你不能建立这样的约束。

解决方案是规范化您的模式,并拥有一个 termek_adat,它与您当前的type相同,但有一个外键返回其父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 和关系世界中,您应该颠倒面向对象世界的正常父子关系,其中父级具有其子级的列表,而在关系中,子级引用父级。通过尝试将 VARRAY(子代)存储在 Elad(父代)中,您遇到了您所询问的参照完整性问题。

是的,您必须加入才能获得给定 Elad 的adat,但这没关系,而且是 SQL 方式。--DD

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

于 2014-04-10T13:11:48.190 回答