如何检查MySQL中更新触发器后修改了哪些字段

icnyk63a  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(120)

我在一个只有4列的表上创建了一个更新后触发器。所以,我在触发器中应用了以下条件-

IF (NEW.courseStartDate <> OLD.courseStartDate )
    THEN
        INSERT INTO tp_courses_audit (`row_id`, `orgId`, `field_name`, `old_value`
        , `new_value`, `created` )
            VALUES (OLD.id, OLD.orgId, 'courseStartDate',OLD.courseStartDate,NEW.courseStartDate,NOW());
    END IF;
    
    IF (NEW.courseEndDate <> OLD.courseEndDate)
    THEN
        INSERT INTO tp_courses_audit (`row_id`, `orgId`, `field_name`, `old_value`
        , `new_value`, `created` )
            VALUES (OLD.id, OLD.orgId, 'courseEndDate',OLD.courseEndDate,NEW.courseEndDate,NOW());
    END IF;
    
    IF (NEW.course_id <> OLD.course_id)
    THEN
        INSERT INTO tp_courses_audit (`row_id`, `orgId`, `field_name`, `old_value`
        , `new_value`, `created` )
            VALUES (OLD.id, OLD.orgId, 'course_id',OLD.course_id,NEW.course_id,NOW());
    END IF;
    
    IF (NEW.status <> OLD.status)
    THEN
        INSERT INTO tp_courses_audit (`row_id`, `orgId`, `field_name`, `old_value`
        , `new_value`, `created` )
            VALUES (OLD.id, OLD.orgId, 'status',OLD.status,NEW.status,NOW());
    END IF;

触发器工作正常,我正在获取审计表中的数据。
我只是想知道,肯定应该有一个更好的方法来识别哪些字段/字段在上次更新中被修改,因为如果我们在主表中有大量的列,那么多个if条件不会是处理这个问题的更好方法。
我怎样才能更好地处理它?

abithluo

abithluo1#

扳机工作正常
否。如果旧值或新值为NULL,则不会记录更改。
你必须使用NULL-safe等于运算符:

If NOT (OLD.column <=> NEW.column) THEN

此外,您还可以将created列定义为DEFAULT CURRENT_TIMESTAMP,并将其从DEFAULT CURRENT_TIMESTAMP中删除。

相关问题