Mysql触发器有什么问题?

时间:2014-09-05 17:30:00

标签: 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;

2 个答案:

答案 0 :(得分:2)

以下是触发器的错误:

1)触发器主体中的SQL UPDATE语句无效。 NEW.active 是对刚刚更新的行中active列的值的引用。这是该行的值,而不是列的名称。

2)即使修改了SQL语句以纠正该问题,我们也不希望针对同一行发出后续UPDATE语句。 (在某些数据库中,这是不允许的;我很惊讶MySQL会允许它。)

3)这是 AFTER UPDATE 触发器。我们认为这个触发器的预期结果(即在特定条件为真时将行中的列设置为特定值)将在 BEFORE UPDATE 触发器中更有效地实现。

以下是将activeconfirmed列设置为1时将attend列设置为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 ;

答案 1 :(得分:1)

您需要更改分隔符,将触发器设置为before并删除更新语句

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 ;