Mysql 仅在对数据进行特定更改时触发

Mysql 仅在对数据进行特定更改时触发,mysql,sql,triggers,Mysql,Sql,Triggers,有人帮我写了以下内容: CREATE TRIGGER update_stats AFTER UPDATE ON user_hours FOR EACH ROW INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES (OLD.user_id, OLD.opportunity_id, -OLD.completed_hours), (NEW.user_id, NEW.opportunity_id,

有人帮我写了以下内容:

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours FOR EACH ROW
INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);
但是,触发器应仅在以下情况下运行:

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.completed_hours = agreed_hours,
user_hours.hours_committed = 'completed'
WHERE  user_hours.hours_committed = 'accepted' 
AND user_hours.completed_hours IS NULL
AND user_calendar.date_start = CURRENT_DATE();
目前,如果手动调整管理员或用户完成的时间,更新触发器仍会运行。我想在代码中添加一些IF语句,但我的所有尝试都未能创建触发器

我要找的东西是:

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours FOR EACH ROW
IF hours_committed = 'completed' THEN
INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);
END IF
END
任何能够提供帮助的人都不希望触发器运行,除非满足特定条件,这让我们很恼火,因为代码可以正常工作,但这会在运行调整查询之外的几天内造成问题

提前谢谢


标记触发器将始终运行,您需要将该条件添加到触发器主体,并比较新更新的列(
new.column
):


你是说
hours\u committed='completed'
?这会给出一个错误:你的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,以了解在第7行末尾的“”附近使用的正确语法(如果结束);您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第1行“如果结束,则结束”附近使用的正确语法是否有一列名为
hours\u completed
?或者是
hours\u committed
?该引用哪个表?相同的问题,更改为hours\u committed:[查询1中的错误]您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,在第7行[查询2中的错误]的“”附近使用正确的语法您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以了解第行“END IF END”附近使用的正确语法1@MarkH:事实上,只需将附加逻辑添加到
ELSE
部分即可。不客气:)
DELIMITER //

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours 
FOR EACH ROW
BEGIN
  IF NEW.hours_committed = 'completed' THEN
    INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
      (OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
      (NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
    ON DUPLICATE KEY UPDATE
      completed_hours = completed_hours + VALUES(completed_hours);
  END IF;
END//