将MySQL触发器中的Null与另一个值进行比较

dan*_*dan 6 mysql null triggers compare

所以这是我的问题我正在更新表行时比较新旧值.但新旧值有时会为空.所以下面的代码不起作用.我可以解决这个问题吗?

谢谢

BEFORE UPDATE ON mytable
   FOR EACH ROW
BEGIN
        IF OLD.assignedto != NEW.assignedto
        THEN
                INSERT INTO history
                    (
                        asset    ,
                        changedfield     ,
                        oldvalue    ,
                        newvalue      
                    )
                    VALUES
                    (
                        NEW.asset,
                        'assignedto',
                        OLD.assignedto,
                        NEW.assignedto
                    );
        END IF;
    END$$
Run Code Online (Sandbox Code Playgroud)

nig*_*der 16

MySql有一个特殊的null-safe等号检查操作符:

<=>

NULL安全相等.此运算符执行与=运算符类似的相等比较,但如果两个操作数均为NULL,则返回1而不是NULL;如果一个操作数为NULL,则返回0而不是NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL
Run Code Online (Sandbox Code Playgroud)

您可以将此运算符与NOT运算符一起使用:

mysql> SELECT NOT (1 <=> 1), NOT (NULL <=> NULL), NOT (1 <=> NULL);
        -> 0, 0, 1
Run Code Online (Sandbox Code Playgroud)

所以,在你的情况下你应该写:

IF NOT (OLD.assignedto <=> NEW.assignedto)
Run Code Online (Sandbox Code Playgroud)


Chr*_*ham 4

尝试:

IF (   (OLD.assignedto IS NOT NULL AND NEW.assignedto IS NOT NULL 
             AND OLD.assignedto != NEW.assignedto)
    OR (OLD.assignedto IS NULL AND NEW.assignedto IS NOT NULL)
    OR (OLD.assignedto IS NOT NULL AND NEW.assignedto IS NULL)
   )
Run Code Online (Sandbox Code Playgroud)

评论非常正确。