22

我可以在我的值表(值)中有一个列作为 knownValues 表的外键引用,并在需要时让它为 NULL,如示例中所示:

表:值

 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表中。

4

5 回答 5

31

外键中的 NULL 是完全可以接受的。处理外键中的 NULL 很棘手,但这并不意味着您将此类列更改为 NOT NULL 并在参考表中插入虚拟(“N/A”、“未知”、“无值”等)记录。

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

于 2010-05-10T12:58:59.660 回答
7

尽管您可以使外键列可以为空,但我建议通常最好设计没有可以为空的外键的表。空值总是会导致某些歧义和不正确的结果,但如果预期有问题的列会受到某些约束,那将是一个双重问题。

于 2010-05-10T12:45:28.813 回答
4

这是一个 1 到 0 到多的关系。我在 SQL Server 上使用过很多次。我相信使用 MySQL 也可以做到这一点。

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

于 2010-05-10T12:36:15.677 回答
1

是的,在您的外键约束列中很有可能有一个 NULL。我刚试过。请记住,如果您不使用 InnoDB 存储引擎,那么无论如何您的外键约束都将被忽略。

于 2010-05-10T12:45:16.147 回答
1

当然,也有可能在外键中有一个 NULL 值,但你不必担心这一点,我希望你可以使用 InnoDB 作为数据库引擎来管理 Key 约束。对于这种情况,我建议使用左连接或右连接从数据库中获取行,并且可以使用 Group By 来避免重复。请不要使用内连接。

于 2010-05-10T13:13:59.220 回答