我的问题如下:
- 表A包含"任务"列表
- 表B包含"TaskProgress"-只是关于在任务上花费的时间、用户ID、任务ID和注释的信息
在表A(任务)中,我有一个触发器,它更新上次更改的日期时间-列DateChanged(旨在捕获用户编辑的日期时间)
在表B(TaskProgress)上,我有一个触发器,它更新任务上花费的总时间(给定task_ID的所有时间总和和表a中更新列TotalTime)
我希望只有当用户进行更新时才更新表A中的DateChanged(除了表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 ;
我使用MySQL 5.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 ;