我明白,除非指定,否則外鍵列可以是NULL並且是重複的(至少在Oracle SQL中)。將外鍵列聲明爲非空且唯一或保留原樣是否更好?這是根據當時的情況作出的決定,還是應該遵循的一般規則?外鍵列應該是唯一的而不是空的?
0
A
回答
2
所有數據庫都允許外鍵爲NULLable和非UNIQUE。您如何選擇聲明特定的外鍵取決於業務案例。
請考慮以下供銷售特勤人員的公司使用的表格。
CountryList (
CountryCode NOT NULL PRIMARY KEY,
CountryName NOT NULL
)
SecretAgents (
CodeName NOT NULL PRIMARY KEY,
HomeCountryCode FOREIGN KEY REFERENCES CountryList(CountryCode)
)
顯然,HomeCountryCode不會是唯一的,因爲您可能在每個國家銷售多個間諜。它可以爲空嗎?這取決於您的商業模式是否需要每個客戶申報其本國或不。如果該模型允許您與沒有本國的人開展業務,或者不希望向您透露本國,那麼該字段應該是無效的。但是,如果在您的業務模型中不考慮無州的演員,則應聲明NOT NULL列,以便無法創建無效的客戶記錄。
現在,考慮附加表
SpyMasters (
CountryCode NOT NULL PRIMARY KEY References CountryList(CountryCode),
Name NOT NULL PRIMARY KEY
)
下表列出間諜有間諜大師這些國家的(單)頭。並非所有國家都會出現在此列表中,但每個國家/地區只能出現一次。在這種情況下,CountryCode字段是UNIQUE - 但您不必明確聲明,因爲PRIMARY KEY總是包含唯一性。
1
該外鍵是另一個表中的屬性。在原始表格(「參考表格」)中,外鍵應該是唯一的並且不是NULL
。事實上,它幾乎總是這張桌子的主要關鍵。
在引用表中,如果始終需要值,則只應聲明引用列不是 - NULL
。如果您不想重複,只應聲明unique
。換句話說,它取決於參考表中的特性,而不是參考表。
相關問題
- 1. 選擇行,而不是唯一的值應該是不同的
- 2. 空值不是唯一的
- 3. 刪除多列唯一鍵而不丟棄外鍵?
- 4. 在兩列上添加外鍵約束是安全的,而一個不是唯一的(MySQL)?
- 5. Android的SQLite PRIMARY KEY必須是唯一的例外,當主鍵是唯一的
- 6. 列塞不是唯一的
- 7. 「主鍵應該是唯一的SQLite」錯誤
- 8. 下面的數據應該是外鍵還是主鍵?
- 9. 在sql server 2008中給外鍵而不是列外鍵
- 10. 唯一約束外鍵列
- 11. 外鍵是否可能是SQL函數而不是列?
- 12. 查詢查找可能的應該是外鍵的列?
- 13. 引用的外鍵具有錯誤的列號。應該是2
- 14. 我應該使用外鍵的外鍵還是字符串值?
- 15. Httpruntime緩存鍵不是唯一的嗎?
- 16. 空,而不是整數外鍵性能和空間考慮
- 17. nhibernate可以檢查唯一的約束,而不是主鍵
- 18. 外鍵是否總是引用另一個表中的唯一鍵?
- 19. Char陣列不是空的時候應該是
- 20. JPA:列在其父代中應該是唯一的。
- 21. Django:創建一個不是主鍵唯一的列
- 22. 我應該返回一個空dict而不是None嗎?
- 23. serialVersionUID對於不同的類應該是唯一的嗎?
- 24. NHibernate應該總是寫NULL而不是空字符串
- 25. user_id是不是唯一的
- 26. ResponseText應該是一個json_encode,而不是CakePHP中的HTML
- 27. 當它應該是一個int時,說「NULL」的外鍵?
- 28. 可能是唯一鍵(不是主鍵)是聲明性外鍵約束的父項
- 29. transid應該是laravel中唯一的存儲檢查(value transid應該是單店)
- 30. 的Java獲取異常而調用Web服務,但唯一的例外是空
這與Oracle SQL無關,與數據建模有關。在列可以爲空或不爲空的情況下,您可以有參照約束,並且它們通常是非唯一的,除非在1:1關係的情況下,在這種情況下,您會對其設置唯一約束。 –