【问题标题】:How to realize that an Oracle SQL OBJECT VARRAY elements using as foreign key如何实现 Oracle SQL OBJECT VARRAY 元素用作外键
【发布时间】:2013-05-09 09:46:29
【问题描述】:

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

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

【问题讨论】:

    标签: sql oracle object foreign-keys varray


    【解决方案1】:

    你不能建立这样的约束。

    解决方案是规范化您的架构,并拥有一个 termek_adat table,它与您当前的 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 可能没有意义。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多