Mysql 在每次更新时触发触发器,而不是只触发一列

Mysql 在每次更新时触发触发器,而不是只触发一列,mysql,sql,database,triggers,Mysql,Sql,Database,Triggers,我在MySQL表中有一个触发器。表有大约20列 DELIMITER $$ CREATE DEFINER=`root`@`localhost` TRIGGER `completion_date_update` BEFORE UPDATE ON `orders` FOR EACH ROW BEGIN IF NEW.`order_status` = 'COMPLETED' THEN SET NEW.`completion_date` = NOW(); END IF; IF NEW

我在MySQL表中有一个触发器。表有大约20列

DELIMITER $$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `completion_date_update`
BEFORE UPDATE ON `orders`
FOR EACH ROW
BEGIN
  IF NEW.`order_status` = 'COMPLETED' THEN
    SET NEW.`completion_date` = NOW();
  END IF;

  IF NEW.`order_status` != 'COMPLETED' THEN
    SET NEW.`completion_date` = NULL;
  END IF;
END$$
我想要的是,当列
订单状态更新时,此触发器仅更新
完成日期
。如果更新了任何其他列,则此触发器不应执行任何操作。
实际发生的情况是,此触发器在任何列更新时更新
完成日期

有谁能向我解释为什么会发生这种情况,我做错了什么

order\u status
列不为空,并具有以下可能值:

enum('NEW','OPEN','COMPLETED','CANCELLED','REPLACED')
默认值为“新建”


谢谢

如果
订单状态
已更改,并且新值是
已完成

IF (NEW.order_status <> OLD.order_status) AND (NEW.order_status = 'COMPLETED') THEN 
    SET NEW.completion_date = NOW();
END IF;
如果(NEW.order\u status OLD.order\u status)和(NEW.order\u status='COMPLETED'),则
设置NEW.completion_date=NOW();
如果结束;

如果下面的
,您可以删除另一个

订单状态是否可以为空?如果该列的值已标记为
已完成
,并且您仅在另一列上运行,则触发该触发器?它是一个具有5个不同选项的枚举。我只是将它设置为NOTNULL。我现在要测试它。@JW。我刚刚用
order\u status
列详细信息更新了我的问题。@JW。就是这样:)
(NEW.order\u status OLD.order\u status)
成功了。非常感谢。你应该给我一个答案让我接受吗?是的,我就是这么做的:)