當我在MySQL中使用外鍵時,如果源值爲0(因爲沒有ID 0的目標記錄),我將得到一個錯誤。因此,我將源列更改爲NULL,然後運行。但是,我不確定這是否應該這樣做是正確的。這是正確的方式,或者我可以保持源ID設置爲0而不是NULL?也可以是零的外鍵
Q
也可以是零的外鍵
8
A
回答
19
外鍵是約束。這意味着如果具有外鍵的列的值設置爲任何值(並且「任何」不包括NULL
),那麼該值必須存在於被引用的表中,否則MySQL將引發錯誤。因此,簡而言之,您可以將值設置爲NULL
,刪除外鍵約束並將值設置爲您希望的任何值,包括0
,或者在參考表中添加帶有0
的記錄。在這些選項中,將值設置爲NULL
似乎是最乾淨的。
3
是的,這是正確的方法。 FK的重點在於強制實際存在帶有被引用ID的記錄。因此,如果將FK列設置爲0,則必須存在ID爲0的記錄。
解決此問題的唯一方法是使FK列可以爲NULL,就像您一樣。
無論如何,你爲什麼要設置FK列爲0? SQL中「不存在」的規範值爲NULL。
4
這是正確的方法。 0是一個值,null表示列中沒有任何內容。
3
由於兩個原因,使用NULL優於零。首先,它是一個「特殊」值更清楚(沒有任何東西強制表id始終爲非零,但它通常適用於自動生成的id),第二,它在SQL中使用外鍵約束。
所以你在做什麼是常見的做法 - 很多人使用NULL作爲標記,說「缺失值」,這就是SQL的外鍵約束所期望的。
處理缺失值的另一種方法是使用第三個「鏈接」表,只有在兩個類之間存在連接時纔會有條目(就像在多對多關係中那樣)。這避免了NULL的需要,所以被某些數據庫純粹主義者所偏好,但是使得一切都變得更加複雜。有關更多討論,請參閱Nullable Foreign Key bad practice?。
相關問題
- 1. 外鍵也是主鍵的一部分
- 2. Oracle Sql:外鍵也是主鍵語法
- 3. 休眠 - @IdClass @ManyToOne - 主鍵也是外鍵
- 4. 獨立的實體,這也是外鍵
- 5. 表中的列可以是主鍵還是外鍵?
- 6. 是否可以使用NULL外鍵?
- 7. 流利的NHibernate的主鍵之一也是外鍵 - OutOfRangeException
- 8. 外鍵引用的主鍵可以是mysql中的varchar(255)嗎?
- 9. 如何創建也是MySQL主鍵的外鍵?
- 10. SQL Server更新主鍵也是兩個表中的外鍵
- 11. 帶主鍵的休眠類也是外鍵
- 12. 改變主鍵列也是另一個表的外鍵 - Mysql
- 13. 外鍵屬性可以是組合主鍵的一部分嗎?
- 14. 外鍵可以爲空嗎?
- 15. 刪除主鍵也刪除外鍵
- 16. MySQL - 也使用外鍵作爲主鍵
- 17. 外鍵可以作爲主鍵嗎?
- 18. 外鍵可以唯一主鍵
- 19. 將外鍵作爲主鍵可以嗎?
- 20. 外鍵是否可以是NULL和/或重複的?
- 21. 我可以測試ActiveRecord的屬性是否是外鍵?
- 22. Spring Data Data Repository for Entity其中外鍵也是主鍵
- 23. 數據庫屬性可以是主鍵和外鍵嗎?
- 24. 子類是否也可以是超類?
- 25. 爲什麼(默認)外鍵是空的? 。 。並且外鍵和主鍵可以是同一列嗎?
- 26. indexedDB是否支持外鍵?如果沒有,我可以模擬外鍵嗎?
- 27. MySQL的外鍵可以爲空
- 28. SQLAlchemy兩個相同名稱的主鍵也是外國的
- 29. 變量在rspec測試中既不是零也不是零
- 30. 可以JMeter的主也可以是負載生成
如果它是「0」或「NULL」,它與你有什麼不同?更不用說從邏輯的角度來說,'0'根本沒有意義。 – Jon 2012-03-18 15:15:25