我有一个MySQL表,其字段分组,规则是每行只使用一个组,并且该组的所有字段都是非空的。
要明确一点,让我们看看其中的一些字段
x_encrypted
x_hashed
y_encrypted
y_hashed
如果插入错误记录,我有一个触发器,表示失败。其中一项检查是
IF (x_encrypted IS NULL != x_hashed IS NULL) ... error
即。 x是加密和散列的,或者它不存在。
这会在x_encrypted IS NULL AND x_hashed IS NULL
的情况下触发错误。修复是这样重写它,带有额外的括号:
IF ((x_encrypted IS NULL) != (x_hashed IS NULL)) ... error
为什么需要这些额外的括号?我看不出这在语法上是多么模糊。我担心有一个陷阱在等我,我在其他地方有类似的与NULL相关的检查我不再信任。
答案 0 :(得分:3)
根据documentation,IS
和!=
具有相同的优先顺序。也:
对于在表达式中以相同优先级发生的运算符,评估从左到右进行,但赋值从右到左进行评估。
这意味着,这个表达式:
x_encrypted IS NULL != x_hashed IS NULL
将被评估为:
((x_encrypted IS NULL) != x_hashed) IS NULL
因此,您必须使用显式括号来覆盖默认的评估顺序。