2011-04-15 194 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