在我的数据表中,我有一个表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。
答案 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
);
现在,从数据模型的角度来看,你有B
到A1
和A2
以及A1
和{{}}的关系,这有点奇怪。 {1}}到A2
。这种循环通常并不理想。您似乎想要消除两组关系中的一种。
答案 1 :(得分:0)
由于两个表都已将B.ID作为外键,因此可以从B表中删除A.ID并强制对两个A表进行检查约束,以确保B.ID尚未被使用无论是表
这将允许您需要的1对1关系,并确保另一个表中的B.ID不能被另一个表使用