Mysql触发器有什么问题?
Mysql触发器有什么问题Mysql触发器有什么问题?,mysql,triggers,Mysql,Triggers,Mysql触发器有什么问题 CREATE TRIGGER ebdaa.active_cus AFTER UPDATE ON ebdaa.appoints FOR EACH ROW BEGIN IF NEW.confirmed = 1 OR NEW.attend =1 THEN update ebdaa.appoints SET NEW.active= 1 ; END IF; END; 您需要更改分隔符,将触发
CREATE TRIGGER ebdaa.active_cus AFTER UPDATE ON ebdaa.appoints
FOR EACH ROW
BEGIN
IF NEW.confirmed = 1 OR NEW.attend =1 THEN
update ebdaa.appoints SET NEW.active= 1 ;
END IF;
END;
您需要更改分隔符,将触发器设置为
之前的,然后删除update语句
delimiter |
CREATE TRIGGER ebdaa.active_cus BEFORE UPDATE ON ebdaa.appoints
FOR EACH ROW
BEGIN
IF NEW.confirmed = 1 OR NEW.attend = 1 THEN
SET NEW.active = 1;
END IF;
END
|
delimiter ;
以下是触发器的问题:
1) 触发器主体中的SQLUPDATE
语句无效NEW.active
是对刚刚更新的行中active
列的值的引用。这是行中的值,而不是列的名称
2) 即使修改了SQL语句以纠正该问题,我们也不希望针对同一行发出后续UPDATE语句。(在某些数据库中,这是不允许的;我很惊讶MySQL会允许这样做。)
3) 这是更新后的触发器。在更新之前的触发器中,我们认为此触发器的预期结果(即,当某些条件为真时,将行中的列设置为特定值)将更有效地实现
下面是一个触发器示例,当confirm
或attent
列设置为1时,该触发器将active
列设置为1:
USE ebdaa;
DELIMITER $$
CREATE TRIGGER active_cus_bu
BEFORE UPDATE ON appoints
FOR EACH ROW
BEGIN
IF ( NEW.confirmed = 1 OR NEW.attend = 1 ) THEN
SET NEW.active = 1;
END IF;
END$$
DELIMITER ;
你真的需要更清楚地问这个问题。这是否导致了错误?如果是,错误是什么?或者它只是做了一些不同于你想象的事情?如果是这样的话,你期望它做什么,以及发生了什么?也就是说,我认为90%的可能性是,在定义触发器时没有使用分隔符,因为对于大多数使用触发器的人来说,这是一个混淆点。MySQL允许使用分隔符,并且在IF语句中触发update语句的每个update语句都将失败。顺便说一下,MySQL不会创建这个更新后触发器+1@VMai例如我同意。如果MySQL允许一个AFTER UPDATE
触发器在同一行的同一个表上发出UPDATE
,那么该UPDATE语句将依次触发该触发器,该触发器将执行另一个更新,该更新将无限期地触发该触发器。(MySQL必须在某个地方抛出一个错误以防止出现这种情况。)是的,将NEW.col
设置为值需要在更新前触发器中执行,而不是在更新后触发器中执行。(我在回答中可能没有说得很清楚。)对我来说,你的回答是清楚的,并且解决了主要的两个问题(包括带重置的分隔符):使用更新前触发器和使用简单的集合,而不是可能导致错误消息的更新(而不是无休止的循环)。对于更新前触发器中相同表上的更新也是如此。