2012-03-18 27 views
8

當我在MySQL中使用外鍵時,如果源值爲0(因爲沒有ID 0的目標記錄),我將得到一個錯誤。因此,我將源列更改爲NULL,然後運行。但是,我不確定這是否應該這樣做是正確的。這是正確的方式,或者我可以保持源ID設置爲0而不是NULL?也可以是零的外鍵

+0

如果它是「0」或「NULL」,它與你有什麼不同?更不用說從邏輯的角度來說,'0'根本沒有意義。 – Jon 2012-03-18 15:15:25

回答

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?

相關問題