2010-05-10 81 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。