2

我在 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列不为空,可能的值如下:

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

默认为'NEW'

谢谢

4

1 回答 1

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下面的另一个。

于 2013-01-22T05:43:06.937 回答