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; 您需要更改分隔符,将触发

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;

您需要更改分隔符,将触发器设置为
之前的
,然后删除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) 触发器主体中的SQL
UPDATE
语句无效
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
设置为值需要在更新前触发器中执行,而不是在更新后触发器中执行。(我在回答中可能没有说得很清楚。)对我来说,你的回答是清楚的,并且解决了主要的两个问题(包括带重置的分隔符):使用更新前触发器和使用简单的集合,而不是可能导致错误消息的更新(而不是无休止的循环)。对于更新前触发器中相同表上的更新也是如此。