MySQL中的外键和NULL

23

我可以在我的值表(value)中有一个列引用到knownValues表作为外键,并且允许它在需要时为空,就像这个例子:

表:values

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

表:types

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

数据表: knownValues

id    Type     name
0     2        banana 

注意:表格中的 valuesknownValues 类型当然被引用到了 types 表格中。

5个回答

33

外键中存在NULL值是可以被接受的。处理外键中的NULL值有些棘手,但这并不意味着你应该将这些列更改为NOT NULL,并在你的参考表中插入虚拟记录(如“N/A”,“未知”,“无值”等)。

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


4
使用INNER JOIN或某种OUTER JOIN取决于您所寻找的结果。有时,使用INNER JOIN可以获得完全符合要求的答案。 - Walter Mitty
1
是的,当您在FK中有NULL行时,在内部连接中您将无法找到所有行;但是可以使用外部连接。 - Salman A
3
有例子吗?使用InnoDB存储引擎时对我没有用 - MySQL。 - dev

7

虽然您可以使外键列可为空,但我建议设计表时尽量避免使用可空的外键。空值不可避免地会导致某些模糊和不正确的结果,但如果相关列预计会受到某些约束条件的影响,则这是一个双重问题。


1
嗨,大卫,你会怎么做呢?需要再添加一个仅用于自由文本值的表格吗? - Industrial
2
是的,将其放入另一个表中是显而易见的方法。如果您使用正确的属性集在表格中表示事实,则不需要使用不适用于属性的空值。只有在某些特殊优势或某些软件限制强制您这样做的情况下,才向模型添加空值。 - nvogel

4

这是一种一对零到多的关系。我在 SQL Server 中使用过很多次。我相信在 MySQL 中也可以实现。

由于与数据聚合相关的问题,我更喜欢避免在数据库中使用 NULL 值,因此根据我的设计,我会在查找表中添加一个 UNKNOWN 行。


4
嗨Raj!你所说的“UNKNOWN row”是什么意思? - Industrial

1

您可以在外键约束列中拥有一个NULL,这是完全可能的。我刚试过了。请注意,如果您没有使用InnoDB存储引擎,则无论如何都会忽略您的外键约束。


1

当然,外键中可能存在空值的可能性,但是你不用担心这个问题,我希望你使用InnoDB作为数据库引擎来管理关键约束。对于这种情况,我建议使用左连接或右连接从数据库中获取行,并且可以使用Group By避免重复。请勿使用Inner Join。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接