Mysql 在每次更新时触发触发器,而不是只触发一列
我在MySQL表中有一个触发器。表有大约20列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
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)
成功了。非常感谢。你应该给我一个答案让我接受吗?是的,我就是这么做的:)