为什么反向操作<>在触发器上不起作用?

时间:2016-03-21 23:25:32

标签: mysql sql triggers

我有一个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.colnameOLD.colnamenull时,所有条件都会返回{{ 1}}。所以我想知道如何创建一个像这样的条件?

false

2 个答案:

答案 0 :(得分:2)

如果NEW.colnameOLD.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
$$