首页 > 解决方案 > 当旧值为 NULL 时,MySQL 触发器更新日期不起作用

问题描述

当用户未提供值时,我需要将 Timestamp 字段更新为 NOW()。

所以我写了这个触发器:

CREATE TRIGGER TRG_SAS_MASTERDATA_TO_IPS_SI_UPDATE_DATE 
BEFORE UPDATE ON SAS_MASTERDATA_TO_IPS_SI 
    FOR EACH ROW 
    BEGIN 
        IF !(NEW.UPDATE_DATE <=> NULL) THEN 
            SET NEW.UPDATE_DATE= NOW(); 
        END IF; 
    END

它运行良好,但时间戳的旧值为 NULL 时除外。在这种情况下,它保持为 NULL。

你有什么主意吗 ?

谢谢

标签: mysqldatabasetriggers

解决方案


从技术上讲,没有在更新中不提供值这样的事情,因为当没有提供值时,这与提供当前/现有值完全相同。

NEW.UPDATE_DATE <=> OLD.UPDATE_DATE将在这两种情况下评估为真(不提供值与提供现有值)。它们在触发器中无法区分。

如果您在表定义中声明这样的列,MySQL 内置的时间戳功能实现了您正在寻找的内容,而无需触发器。

UPDATE_DATE TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP

https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

如果更新查询中未提供列值,但更新至少更改了另一列,则时间戳列将设置为NOW()


推荐阅读