2014-09-05 86 views
-2

Mysql触发器有什么问题?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

你真的需要更清楚地提出这样的问题。这是否导致错误?如果是这样,错误是什么?还是它做了一些不同于你认为会做的事情?如果是这样,你期望它做什么,而发生了什么?也就是说,我认为在定义触发器时,问题的原因可能是您没有使用DELIMITER,因为对于大多数使用触发器的人来说,这是一个混乱点。 – 2014-09-05 17:32:18

回答

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 ; 
2

这里是什么地方错了扳机:

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

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

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

下面是该active列设置为1,当任confirmedattend列设置为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

MySQL允许它,并且触发IF语句中的UPDATE语句的每个更新语句都将失败。顺便说一下,MySQL不会创建这个作为AFTER UPDATE触发器。 +1 – VMai 2014-09-05 17:58:58

+1

@VMai:我同意(我认为)。如果MySQL允许'AFTER UPDATE'触发器在同一行的同一个表上发出'UPDATE',那么UPDATE语句会触发触发器,然后执行另一个UPDATE触发触发器,广告无穷。 (MySQL必须在某个地方抛出一个错误来防止这种情况发生)。是的,将'NEW.col'设置为值需要在** BEFORE UPDATE **触发器中执行,而不是AFTER UPDATE。 (我可能没有在我的答案中说清楚) – spencer7593 2014-09-05 19:02:14

+0

对于我来说,你的回答是清楚的,并处理了主要的两个问题(包括重置DELIMITER):使用BEFORE UPDATE触发器并使用简单SET而不是更新可能导致确实产生错误消息(而不是无限循环)。对于BEFORE UPDATE触发器中同一个表上的UPDATE,情况也是如此。 – VMai 2014-09-05 19:06:44