2010-05-10 77 views
13

我可以作爲一個外鍵knownValues表中引用了我的價值觀表(值)一列,並讓它爲NULL,只要需要,像例如:外鍵和NULL在MySQL的

表:值

product  type  value  freevalue 
0   1  NULL  100 
1   2  NULL  25 
3   3  1   NULL 

表:類型

id name  prefix 
0  length cm 
1  weight kg 
2  fruit NULL 

表:knownValues

id Type  name 
0  2  banana 

注意:表values & knownValues中的類型當然被引用到types表中。

回答

17

外鍵中的NULL是完全可以接受的。處理外鍵中的NULL是非常棘手的,但這並不意味着您將這些列更改爲NOT NULL,並在參考表中插入du​​mmy(「N/A」,「Unknown」,「No Value」等)記錄。

在外鍵中使用NULL通常需要使用LEFT/RIGHT JOIN而不是INNER JOIN。

+3

使用INNER連接或某種OUTER連接取決於您正在查找的結果。有時候INNER連接會給出所需的答案。 – 2010-05-10 13:44:16

+1

是的,並且在FK中有NULL行的情況下,您將找不到具有內部聯接的* all *行;但是有一個外連接。 – 2010-05-10 13:54:52

+1

有沒有例子?這對我使用InnoDB存儲引擎 - MySQL並不適用 – dev 2014-06-10 18:13:02

3

這是一個1到零對多的關係。我已經多次使用SQL Server。我相信也可以用MySQL來做到這一點。

我更喜歡避免在我的數據庫中出現NULL,因爲與數據聚合有關的問題,所以根據我的設計,我在查找表中放入了UNKNOWN行。

+4

嗨Raj!你的意思是「UNKNOWN row」? – Industrial 2010-05-10 12:59:16

1

是的,您的外鍵約束列中可能有NULL。我只是試了一下。請記住,如果您不使用InnoDB存儲引擎,則無論如何您的外鍵約束將被忽略。

+0

當然使用InnoDB! – Industrial 2010-05-10 12:49:48

4

儘管您可以使外鍵列可以爲空,但我建議通常設計不帶空的外鍵的表更好。空值總會導致某些含糊不清和不正確的結果,但如果所討論的列預計會受到某些約束,那麼這就成爲一個雙重問題。

+1

嗨大衛,那麼你會怎麼做呢?只有自由文本值的附加表? – Industrial 2010-05-10 12:50:10

+1

是的,把它放進另一張桌子是明顯的方法。如果您使用正確的一組屬性在表格中表示事實,那麼您將不需要使用空值來應用不適用的屬性。只有在模型中增加空值時,纔會有一些特殊的優勢,或者某些軟件限制會迫使您使用。 – sqlvogel 2010-05-10 13:13:37

1

當然,在外鍵中有一個可能性是NULL值,但爲此您不必擔心這一點,我希望您可以使用InnoDB作爲數據庫引擎來管理Key約束。對於這種情況,我建議使用左連接或右連接來獲取來自數據庫的行,並且可以使用組依據來避免重複。請不要使用Inner Join。