外键也可以为零

时间:2012-03-18 15:11:59

标签: mysql foreign-keys

当我在MySQL中使用外键时,如果源值为0(因为没有ID为0的目标记录),我将收到错误。因此,我将源列更改为NULL,然后它可以工作。但是,我不确定这是否应该这样做。这是正确的方法,还是我能以某种方式将源ID设置为0而不是NULL?

5 个答案:

答案 0 :(得分:23)

外键是约束。这意味着如果具有外键的列的值设置为任何值(并且“任何”不包括NULL),则该值必须存在于引用的表中,否则MySQL将引发错误。

因此,简而言之,您可以将值设置为NULL,删除外键约束并将值设置为您想要的任何值,包括0,或者添加带{{1}的记录1}}在引用的表中。在这些选项中,将值设置为0似乎是最干净的。

答案 1 :(得分:4)

这是正确的方法。 0是一个值,null表示列中没有任何内容。

答案 2 :(得分:4)

出于两个原因,使用NULL优于零。首先,更清楚的是它是一个“特殊”值(没有什么能迫使表id始终为非零,尽管对于自动生成的ID通常是正确的),其次它在SQL中使用外键约束。< / p>

所以你正在做的是通常的做法 - 许多人使用NULL作为标记,表示“缺失值”,这就是SQL的外键约束所期望的。

处理缺失值的另一种方法是使用第三个“链接”表,只有在两个类之间存在连接时才会有一个条目(就像在多对多关系中那样)。这避免了对NULL的需要,因此被某些数据库纯粹主义者所青睐,但使一切变得更加复杂。有关更多讨论,请参阅Nullable Foreign Key bad practice?

答案 3 :(得分:3)

是的,这是正确的方法。 FK的重点是强制实际存在具有引用ID的记录。因此,如果将FK列设置为0,则必须有ID为0的记录。

解决这个问题的唯一方法是使FK列为NULL,就像你一样。

无论如何,为什么要将FK列设置为0? SQL中“不存在”的规范值为NULL。

答案 4 :(得分:0)

是的,这是在这些情况下使用的正确方法和正确模式。

如上所述,这些结构中指示的是将列保留为空,表示该行不会链接到外部表中的任何对应项。它在数据库理论中不被认为是“正确的”,但它是一种非常常用的模式,因此,大多数数据库设计者实际上并不认为它是“错误的”。我想您可以说这是您在尝试查找结构中的错误时尽量不注意的那种模式。

该模式被认为是不正确的,因为它应该在主键中使用非空列,从这个意义上说,表中将接收键的列必须与表的主列相同,即,它们永远不会为空。但是,在物理上的大多数数据库中,创建不同的列没有任何障碍,这使得空值成为可能。

这种架构的问题是当表变得太大时,p。例如,它有 1000 多行(是的,“大”行就那么低!),在这些情况下,特别是在小型基础设施中,回答时间开始变得过长且“有问题”。碰巧空记录不能成为索引的一部分,算法最终会进行全面扫描。因此,当我们知道表总是非常非常小时,就会实现这种类型的模式!否则,我建议使用创建外部表的模式,其中“空”选项在您的情况下将是另一个表中的“未找到”。