我有这个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约束有关吗?
答案 0 :(得分:0)
逻辑很简单:你不能真实地说NULL
是否等于2,因为你对[{1}}一无所知。引用the doc:
从概念上讲,
NULL
表示“缺少未知值”并对其进行处理 与其他价值观略有不同。你不能使用算术 比较运算符,例如=,<或<>测试NULL
。 [...] 因为与NULL
进行任何算术比较的结果也是如此NULL
,您无法通过此类比较获得任何有意义的结果。
您已经在问题中显示了一种可能的解决方法,另一种是使用NULL
(NULL-safe comparison operator):
<=>
答案 1 :(得分:0)
NULL不是数字。这在mysql中完全不同。所以你无法将某些东西与NULL进行比较。为了清除您的困惑,在您的情况下,FK不是2的所有字段都是“值”不是2的字段。但是当值为NULL时,表示根本没有赋值。