避免在 MYSQL 中被另一个触发器触发

Avoid firing trigger by another trigger in MYSQL

我的问题如下:

在 table A(任务)上,我有触发器,它更新上次更改的日期时间 - DateChanged 列(旨在捕获用户所做编辑的日期时间)

在 table B (TaskProgress) 上我有触发器,它更新在任务上花费的总时间(给定 Task_ID 的所有时间求和并更新 table A 中的列 TotalTime)

我希望仅在用户进行更新时更新 Table A 中的 DateChanged(这是每次,除非触发 table B 更新 TotalTime)

所以我想知道,是否有一种方法可以告诉数据库在更新另一个触发器中的值时不要触发 TRIGGER。

/* set date of last change and date od closing of task */
DELIMITER $$
CREATE TRIGGER before_tasks_update 
BEFORE UPDATE ON tasks
FOR EACH ROW BEGIN
    SET new.DateChanged = NOW();
    IF new.Status_ID = 3 THEN
        SET new.DateClosed = NOW();
    END IF;
END$$
DELIMITER ;

/* set total time spent on task */
DELIMITER $$
CREATE TRIGGER after_taskprogress_insert
AFTER INSERT ON taskprogress
FOR EACH ROW BEGIN
    DECLARE sumtime TIME;
    SET @sumtime := (SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `timeSpent` ) ) )
        FROM taskprogress WHERE Task_ID = new.Task_ID);
    UPDATE `tasks` SET TimeReal = @sumtime WHERE ID = new.Task_ID;
END $$
DELIMITER ;

我用的是MySQL5.5.40

谢谢,zbynek

添加检查以验证更新是否意味着新的 TimeReal 值,因为只有第二个触发器会更新该列。

DELIMITER $$
CREATE TRIGGER before_tasks_update 
BEFORE UPDATE ON tasks
FOR EACH ROW BEGIN
    IF new.TimeReal=old.TimeReal THEN SET new.DateChanged = NOW();
    END IF;
    IF new.TimeReal=old.TimeReal AND new.Status_ID = 3 THEN
        SET new.DateClosed = NOW();
    END IF;
END$$
DELIMITER ;