2011-02-16 59 views
17

當使用整數列時,最好有0或NULL來表示沒有值。例如,如果一個表有一個parent_id字段,並且一個特定的條目沒有父對象,你會使用0還是NULL。我過去總是使用0,這是因爲我來自Java世界(1.5之前)整數總是必須有一個值。我主要問的是表現方面的問題,我並不太擔心哪個是「更正確」的選擇。MySQL整數0對NULL

+0

如果您不擔心哪個「更正確」,那麼只需從調用數據庫的報表或應用程序中輸出一個硬編碼的零;這比使用任何數據庫要快得多。 – 2015-03-16 19:07:56

回答

20

使用NULL是優選的,原因有二:

  1. NULL用來表示該字段沒有價值,這是你想要的模型到底是什麼。
  2. 如果您決定在將來添加一些參照完整性約束條件,則必須使用NULL
1

0仍然是整數列的有效值。因此,您必須使用NULL並在該列上允許爲空。另外,如果您僅將整數列用於正數,則可以使用-1作爲無值。

在你的PARENT_ID參考示例使用0,直到您確保沒有參考IDS ID爲0

4

使用NULL爲「沒有價值」實際上就是正確的開始是好的。 0是一個整數的值,因此它有意義。 NULL otoh字面意思是沒有任何東西,所以沒有價值。

性能可能無關緊要,但如果您學習使用NULL正確編碼,則使用NULL可能會更快一些。

3

你不應該期望看到從這個

+1

點點滴滴。 保存一切。它堆積起來! – ninjabber 2015-12-15 15:08:33

2

任何現實生活中的性能差異在你PARENT_ID例如0是完全有效的,因爲它代表着「根」。在大多數情況下,NULL在邏輯上是「無價值」的更好選擇。

雖然我沒有對性能產生影響。

15

如果可能,聲明列爲NOT NULL。通過更好地使用索引並消除測試每個值是否爲NULL的開銷,它使SQL操作更快。您還可以節省一些存儲空間,每列一位。如果您真的需要表中的NULL值,請使用它們。只需避免在每列中都允許NULL值的默認設置。

MySQL - optimizing data size

+1

+1。我仍然會爭辯說,''沒有價值'是可能的這個列「是足夠的理由使用NULL。我想在不違反常識的情況下進行基準測試。這句話只是談論你真的,實際上永遠不會以這種方式使用它的專欄,AFAICT。 – 2013-01-30 06:21:48

1

我覺得0可以用來代替NULL,如果你不實際指望0用作值。

這就是例如你的列是一個外鍵。由於外鍵通常不以0開始,而是以1開始,這意味着您不會期望0被用作值。

然後,您可以使用0表示「否」值狀態。在連接中使用它不會匹配另一個表上的任何列。因此,具有與NULL相同的效果。

但是,如果你有一個列其中的0實際上有一個含義。像例如一個數量字段。除此之外,你還需要表達和清空價值。例如,表示數量尚未輸入。那麼你需要一個NULL。

希望是有道理的。

2

UNIQUE(id1, id2)將與空值在另一方面,如果你使用的0不能工作,因爲它允許,例如1, null兩次

JOIN atable ON this.extID = atable.ID聯結將執行(導致沒有行加入),而將空只是被忽略

無論如何,我建議,除非空值從NULL

不同的含義,始終使用,而不是NULL「空值」(如0或空字符串),我也修改查詢,像這樣:JOIN atable ON this.extID = atable.id AND extID > 0這阻止了執行無用的連接