Oracle:两个表联合的FK?

时间:2009-08-21 01:44:39

标签: oracle foreign-keys

我的情况(简化)看起来像这样:

  • 表UNITS在UNITS.NAME上有一个PK。 (单位名称,varchar(12))
  • 表DEPTS在DEPTS.NAME上有一个PK。 (dept name,varchar(12))

  • 我想创建一个包含列UNIT_NAME_OR_DEPT_NAME的表格 要求此列中的数据必须是有效单位 姓名或有效的部门名称。

我尝试添加两个FK约束,但发现这给了我 交叉而不是两个表的结合。

 CONSTRAINT FOO_FK1 FOREIGN KEY(NAME) REFERENCES UNITS(NAME) ENABLE,
 CONSTRAINT FOO_FK2 FOREIGN KEY(NAME) REFERENCES DEPTS(NAME) ENABLE,

如何创建我要引用的FK或其他约束 两个表的结合?

3 个答案:

答案 0 :(得分:1)

为什么您希望一列指向两个不同的表?为什么不是多个中的两个不同的列:很多关系?在允许插入之前,您可能必须使用触发器来检查至少有一个不为null。

答案 1 :(得分:1)

我会使用两个隐藏的列units_fkdept_fk以及适当的FK约束和一个额外的CHECK CONSTRAINT,例如,如果伪列是必需的:

CONSTRAINT chk_units_dept_fk CHECK 
    (units_fk IS NULL AND dept_fk IS NOT NULL)
 OR (units_fk IS NOT NULL AND dept_fk IS NULL)

然后,您可以在视图中添加阴影列

CREATE VIEW my_view AS 
SELECT col1,...coln, nvl(units_fk, dept_fk) as UNIT_NAME_OR_DEPT_NAME
  FROM my_table

您可以使用程序(我的选择)或INSTEAD OF TRIGGER来处理伪列的更新。

答案 2 :(得分:0)

我想我会这样做:

有一个名为“MasterKey”(或其他)的序列。

有一个名为“SequencesUsed”的第三个表或者只有一个列的东西 - 来自MasterKey的使用值。在unit和department表中创建新记录时,在sequencesUsed表中触发一条新记录,并将相应表中生成的值作为foriegn键放置。

您的新表将有一个名为“dept_or_unit_id”的字段,其中包含SequencesUsed表作为其外键。

这样的事情:

MasterKey:列:ID值:1,2,3,4, 单位:列:名称,主键值:foo,1;酒吧,3; 部门:列:名称,主密钥。值:1,2;明星,4; NewTable:列:masterkey值:1,2,3,4

根据你使用数据的方式,可能有一种方法可以改善这一点,但是如果在两个地方有一个场点,那么连接似乎要晚得多。