Mysql:where ..id!= X不包含NULL外键

时间:2014-12-11 11:37:14

标签: mysql foreign-keys conditional-statements

我有这个Mysql表:

赋值:assignment_id(PK),company_id(FK),......其他一些字段......

如果尚未将分配分配给公司,则FK company_id可以为NULL。

现在,我想查询不属于id为2的公司的所有作业。所以我做了:

SELECT * FROM assignment WHERE company_id != 2

令我惊讶的是,结果中没有返回带有company_id NULL的赋值。我会说NULL!= 2所以应该返回它。如果我选择

,它可以正常工作
(company_id IS NULL OR company_id != 2)

有人可以解释一下这背后的逻辑吗?它与FK约束有关吗?

2 个答案:

答案 0 :(得分:0)

逻辑很简单:你不能真实地说NULL是否等于2,因为你对[{1}}一无所知。引用the doc

  

从概念上讲,NULL表示“缺少未知值”并对其进行处理   与其他价值观略有不同。你不能使用算术   比较运算符,例如=,<或<>测试NULL。 [...]   因为与NULL进行任何算术比较的结果也是如此   NULL,您无法通过此类比较获得任何有意义的结果。

您已经在问题中显示了一种可能的解决方法,另一种是使用NULLNULL-safe comparison operator):

<=>

答案 1 :(得分:0)

NULL不是数字。这在mysql中完全不同。所以你无法将某些东西与NULL进行比较。为了清除您的困惑,在您的情况下,FK不是2的所有字段都是“值”不是2的字段。但是当值为NULL时,表示根本没有赋值。

请参阅MySql documentation