我需要在某个表B上定义一个外键约束,其中列ID必须在表A的集合中。 OR 它可能是NULL(这也是有效的值) )。 击>
(A.ID列不能同时为NULL)。
我应该使用CHECK子句吗?
UPD:对不起,我写错了。我的意思是:我需要在某个表B上定义一个外键约束,其中列ID必须在表A的集合中。 OR 它可能零(那就是也是有效的价值)。
(A.ID列不能同时零。)
答案 0 :(得分:1)
是。
除非插入A.ID = 0的行,否则外键约束将不起作用。
答案 1 :(得分:0)
只需制定一个FOREIGN KEY
约束。 B.ID
可能仍为NULL
。
您可以在psoug
上找到一些示例我不建议存储0
而不是NULL
。 0
在关系数据中没有语义,并且手动CHECK
约束将难以维护,并且可能性能降低很多,因为Oracle的基于成本的优化器可能无法将其用于其查询转换。最好将NULL
插入外键列,并可能使用以下任何等效表达式读取它:
NVL(B.ID, 0)
DECODE(B.ID, NULL, 0, B.ID)
CASE B.ID WHEN NULL THEN 0 ELSE B.ID END
答案 2 :(得分:0)
如果我理解正确,您不需要检查约束。只是一个普通的可空列,带有引用A.ID的外键。这样,接受的值都是A.ID中的值,并且为NULL。
在问题更新后更新了答案:如果无法在A.ID中插入值0,则无法使用外键。但正如其他人所说,这不是推荐的做法 - 最好在A.ID中插入0值并创建外键,或者在表B中使用NULL代替0。