如何实现两个外键中的一个是NULL,而另一个不是

时间:2014-03-29 00:03:46

标签: sql oracle11g

在我的数据表中,我有一个表B,其中 条目属于表A1 表A2。每个A1只有一个B,A2也是如此。到目前为止,我的模型看起来像这样:

TABLE A1
ID ... PK
B  ... FK

TABLE A2
ID ... PK
B  ... FK

TABLE B
ID ... PK
A1 ... FK
A2 ... FK

但是现在B可以属于A1 A2,我想要避免。因此在表B中,两个外键中的一个恰好是NULL,而另一个不是。是否有可能在SQL中实现这一点?

我正在使用Oracle DB 11g。

2 个答案:

答案 0 :(得分:2)

听起来你错过CHECK

上的B约束
ALTER TABLE b
  ADD CONSTRAINT chk_one_a 
           CHECK(    (a1 IS NULL or a2 IS NULL)         -- 1 is NULL
                 and (a1 IS NOT NULL or a2 IS NOT NULL) -- 1 is MOT NULL 
                );

现在,从数据模型的角度来看,你有BA1A2以及A1和{{}}的关系,这有点奇怪。 {1}}到A2。这种循环通常并不理想。您似乎想要消除两组关系中的一种。

答案 1 :(得分:0)

由于两个表都已将B.ID作为外键,因此可以从B表中删除A.ID并强制对两个A表进行检查约束,以确保B.ID尚未被使用无论是表

这将允许您需要的1对1关系,并确保另一个表中的B.ID不能被另一个表使用