我需要在某些表B上定義外鍵約束,其中列ID必須位於表A集中。ID
或它可能爲NULL(也可能爲有效值)。
Oracle外鍵約束問題
(A.ID列不能同時爲NULL)。
我應該使用CHECK子句嗎?
UPD:對不起,我寫錯了。我的意思是:
我需要定義一些表B,其中一列ID必須在配置表A.ID 或的外鍵約束可能零(這將是有效值太)。
(A.ID列不能同時爲零)。
我需要在某些表B上定義外鍵約束,其中列ID必須位於表A集中。ID
或它可能爲NULL(也可能爲有效值)。
Oracle外鍵約束問題
(A.ID列不能同時爲NULL)。
我應該使用CHECK子句嗎?
UPD:對不起,我寫錯了。我的意思是:
我需要定義一些表B,其中一列ID必須在配置表A.ID 或的外鍵約束可能零(這將是有效值太)。
(A.ID列不能同時爲零)。
只是作出FOREIGN KEY
約束。 B.ID
可能仍然是NULL
。
你會發現psoug
一些例子我不建議存放0
而不是NULL
。 0
在關係數據中沒有語義,並且手動約束將更難以維護,並且性能可能會低很多,因爲Oracle基於成本的優化器可能無法將其用於其查詢轉換。更好地插入NULL
到外鍵列,並可能讀它使用這些等效表述的:
NVL(B.ID, 0)
DECODE(B.ID, NULL, 0, B.ID)
CASE B.ID WHEN NULL THEN 0 ELSE B.ID END
你不需要檢查約束,如果我理解正確。只是一個普通的可空列,引用了A.ID的外鍵。這樣,接受的值就是A.ID和NULL中的所有值。
問題更新後的更新回答:如果無法在A.ID中插入值0,則無法使用外鍵。但正如其他人所說的,這不是一個推薦的做法 - 最好在A.ID中插入0值並創建外鍵,或者在表B中使用NULL替代0.
是的。除非你插入一個A.ID = 0
奇怪的一排
外鍵約束將無法正常工作,但我得到這個錯誤:ORA-02091:事務回滾 ORA-02291:完整性約束(ENWIKI .REVISION_FK2)違反 - 父鍵未找到... – 2011-04-15 09:10:11
這意味着你正在'B.ID'中插入一個值,它在'A.ID'中不存在(還有?)。另一方面,你可能有一個完全不同的外鍵,導致了這個問題? – 2011-04-15 09:12:39
查看我的更新。請原諒我錯誤的問題! – 2011-04-15 09:18:09