MySql - 触发器未按预期运行

时间:2012-11-25 03:25:56

标签: mysql triggers

新的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.我做错了什么?这段代码应该怎么样?

1 个答案:

答案 0 :(得分:-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子句;鉴于第一和第二个问题得到了解决。