我的情况(简化)看起来像这样:
表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或其他约束 两个表的结合?
答案 0 :(得分:1)
为什么您希望一列指向两个不同的表?为什么不是多个中的两个不同的列:很多关系?在允许插入之前,您可能必须使用触发器来检查至少有一个不为null。
答案 1 :(得分:1)
我会使用两个隐藏的列units_fk
和dept_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
根据你使用数据的方式,可能有一种方法可以改善这一点,但是如果在两个地方有一个场点,那么连接似乎要晚得多。