2011-04-15 95 views
1

我需要在某些表B上定义外键约束,其中列ID必须位于表A集中。ID 它可能为NULL(也可能为有效值)。 Oracle外键约束问题

(A.ID列不能同时为NULL)。

我应该使用CHECK子句吗?

UPD:对不起,我写错了。我的意思是:

我需要定义一些表B,其中一列ID必须在配置表A.ID 的外键约束可能(这将是有效值太)。

(A.ID列不能同时为)。

回答

0

只是作出FOREIGN KEY约束。 B.ID可能仍然是NULL

你会发现psoug

一些例子我不建议存放0而不是NULL0在关系数据中没有语义,并且手动约束将更难以维护,并且性能可能会低很多,因为Oracle基于成本的优化器可能无法将其用于其查询转换。更好地插入NULL到外键列,并可能读它使用这些等效表述的:

NVL(B.ID, 0) 
DECODE(B.ID, NULL, 0, B.ID) 
CASE B.ID WHEN NULL THEN 0 ELSE B.ID END 
+0

奇怪的一排

外键约束将无法正常工作,但我得到这个错误:ORA-02091:事务回滚 ORA-02291:完整性约束(ENWIKI .REVISION_FK2)违反 - 父键未找到... – 2011-04-15 09:10:11

+0

这意味着你正在'B.ID'中插入一个值,它在'A.ID'中不存在(还有?)。另一方面,你可能有一个完全不同的外键,导致了这个问题? – 2011-04-15 09:12:39

+0

查看我的更新。请原谅我错误的问题! – 2011-04-15 09:18:09

0

你不需要检查约束,如果我理解正确。只是一个普通的可空列,引用了A.ID的外键。这样,接受的值就是A.ID和NULL中的所有值。

问题更新后的更新回答:如果无法在A.ID中插入值0,则无法使用外键。但正如其他人所说的,这不是一个推荐的做法 - 最好在A.ID中插入0值并创建外键,或者在表B中使用NULL替代0.

1

是的。除非你插入一个A.ID = 0