我有一个AFTER UPDATE
的触发器。我有一个不起作用的条件,我该如何解决?
$$
BEGIN
IF NEW.colname <> OLD.colname THEN
DELETE FROM tableX WHERE id = OLD.id;
END IF;
END
$$
应该注意的是,如果我写这个IF 1 THEN
,那么DELETE
查询就可以了。所以问题在于条件。怎么了?
正如 @Darwin von Corax 在评论中所说,当其中一个NEW.colname
,OLD.colname
为null
时,所有条件都会返回{{ 1}}。所以我想知道如何创建一个像这样的条件?
false
答案 0 :(得分:2)
如果NEW.colname
或OLD.colname
null
,则<>
将返回 null
其中if
会将其视为 false
。
幸运的是,有一个解决方案:<=>
(NULL安全相等)运算符,如果两个操作数都是 1
并且{{},则返回null
1}}如果只有一个。表达式
0
应该做你需要的。
答案 1 :(得分:1)
只需添加用于检查空条件的逻辑。当两列都为空时,不会触发它,这意味着不会发生任何更改。
$$
BEGIN
IF
-- when exactly one of the column is null
NEW.colname is not null and OLD.colname is null or
NEW.colname is null and OLD.colname is not null or
-- when both are not null compare their values
NEW.colname is not null and OLD.colname is not null and NEW.colname <> OLD.colname THEN
DELETE FROM tableX WHERE id = OLD.id;
END IF;
END
$$