外键也可以为零

Rei*_*ica 10 mysql foreign-keys

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

Joe*_*oni 24

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

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


elr*_*ado 6

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


sle*_*ske 5

是的,这是正确的方法。FK 的全部意义在于强制具有引用 ID 的记录实际存在。所以如果你把FK列设置为0,那么肯定有一个ID为0的记录。

解决此问题的唯一方法是使 FK 列可以为 NULL,就像您所做的那样。

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


and*_*oke 5

使用 NULL 比零好有两个原因。首先,更清楚的是它是一个“特殊”值(没有什么可以强制表 id 始终为非零,尽管对于自动生成的 id 来说通常是正确的),其次它在具有外键约束的 SQL 中工作。

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

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