如果列中的值为null,则更新后触发器无法正常工作

时间:2011-12-12 11:51:34

标签: mysql triggers

我正在创建一个像这样的触发器

CREATE TRIGGER trigger_academictermregistration AFTER UPDATE ON academictermregistration FOR EACH ROW
BEGIN
    DECLARE summary TEXT(65535);
    SET summary = '';
    IF(NEW.version <> OLD.version) THEN
        SET summary = concat(summary, '    @VER: ', OLD.version, '-->', NEW.version);
    END IF;
    IF(NEW.isDeleted <> OLD.isDeleted) THEN
        SET summary = concat(summary, '    @IS_DELETED: ', OLD.isDeleted, '-->', NEW.isDeleted);
    END IF;

    INSERT INTO auditinfo (entityId, entityName, importance, details, modifiedOn, modifiedBy)
        VALUE (NEW.id, 'AcademicTermRegistration', 1, summary, NOW(), NEW.modifiedBy);

    IF(NEW.id <> OLD.id) THEN
        INSERT INTO auditinfo (entityId, entityName, importance, details, timestamp, user_id)
        VALUE (OLD.id, 'AcademicTermRegistration', 5, concat('ID: ', OLD.id, '-->', NEW.id), NOW(), 'backend');
    END IF;
END

我有一个这样的触发器,这是在更新表后跟踪列值所做的更改,但是如果任何值为null(比如isDeleted),那么将该值更新为非null auditinfo表中没有详细信息

1 个答案:

答案 0 :(得分:1)

从引用 - CONCAT()返回NULL,如果任何参数为NULL。

使用COALESCE功能,例如 -

SET summary = CONCAT(summary, '    @IS_DELETED: ', COALESCE(OLD.isDeleted, 'NULL'), '-->', COALESCE(NEW.isDeleted, 'NULL'));

此外,您可以使用CONCAT_WS()函数,它会在分隔符参数后跳过任何NULL值 -

SET summary = CONCAT_WS('', summary, '    @IS_DELETED: ', OLD.isDeleted, '-->', NEW.isDeleted);