触发每次更新而不是仅一列

时间:2013-01-22 05:19:01

标签: 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.`order_status` != 'COMPLETED' THEN
    SET NEW.`completion_date` = NULL;
  END IF;
END$$

我想要的是在更新列completion_date时触发更新order_status 的触发器。如果更新任何其他列,则此触发器不应执行任何操作 实际发生的是这个触发器在任何列更新时更新completion_date

任何人都可以向我解释为什么会发生这种情况以及我做错了什么?

order_status列不是NULL并且具有可能的值,如下所示:

enum('NEW','OPEN','COMPLETED','CANCELLED','REPLACED')

默认为'NEW'

由于

1 个答案:

答案 0 :(得分:1)

您还应该比较order_status是否已更改且新值是COMPLETED

IF (NEW.order_status <> OLD.order_status) AND (NEW.order_status = 'COMPLETED') THEN 
    SET NEW.completion_date = NOW();
END IF;

您可以删除下面的其他IF