2012-11-25 30 views
0

MySql触发器的新手,只是学习。MySql - 触发器没有按预期运行

CREATE TRIGGER MyTrigger 
AFTER UPDATE ON MyTable 
FOR EACH ROW 
BEGIN 
IF (new.field1 < 0 or new.field1 > 5) THEN 
    UPDATE new SET new.field1 = old.field1; 
END IF; 
END; 

目标是保持field1的值相同,如果更新使其超出范围。 但是,它将其设置为0.我做错了什么?这个代码应该怎么看?

+0

尝试'BEFORE UPDATE'并简单地'new.field = old.field'而无需'UPDATE'ing。 – soulseekah

+0

不,结果相同。为什么这个工作会更好? – Trup

回答

-1

下面是一个例子会告诉你如何开始:

DELIMITER ~ 
CREATE TRIGGER `so_13547992_trigger` 
BEFORE UPDATE ON `so_13547992` 
FOR EACH ROW BEGIN 
    IF (NEW.`field1` < 0 OR NEW.`field1` > 5) THEN 
     SET NEW.`field1` = OLD.`field1`; 
    END IF; 
END; 
~ 

它为什么会工作得更好?那么首先你的示例触发器是递归的,你不能更新由更新触发的触发器中的同一个表。

其次new在你的UPDATE声明中不是表名,你需要明确指定一个。

它似乎并不是一个合法的触发器,当你尝试创建它时,你的服务器不会抱怨吗?您是否可以实际显示SHOW CREATE TRIGGER `your_trigger`;以确保它是真正创建的,并且看起来像是将其粘贴在上面?

即使您的示例能够工作,您仍然试图在表格的所有行上执行不受限制的更新,而不是您尝试更新的更新,您应该有WHERE子句;再次,考虑到第一个和第二个问题的处理。