【问题标题】:Trigger firing on every update instead of just one column在每次更新时触发触发,而不仅仅是一列
【发布时间】:2013-01-22 05:19:01
【问题描述】:

我在 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_status 列时更新order_status。如果更新了任何其他列,则此触发器不应执行任何操作。
实际发生的情况是,此触发器会在任何列更新时更新 completion_date

谁能向我解释为什么会发生这种情况以及我做错了什么?

order_status 列不为空,可能的值如下:

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

默认为'NEW'

谢谢

【问题讨论】:

  • order_status 可以为空吗?如果列的值已经标记为 completed 并且您只是在另一列上上升,则触发器会触发?
  • 这是一个有 5 个不同选项的 ENUM。我只是将其设置为 NOT NULL。我现在就测试一下。
  • @JW。我刚刚用order_status 列详细信息更新了我的问题。
  • @JW。就是这样:) (NEW.order_status <> OLD.order_status) 成功了。谢谢你。您是否应该将其作为答案以便我接受?

标签: mysql sql database triggers


【解决方案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

【讨论】:

  • 是的,我就是这样做的 :)
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2017-12-14
  • 2011-08-13
  • 2020-08-25
相关资源
最近更新 更多