0

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。我做错了什么?这段代码应该怎么看?

4

1 回答 1

-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子句;再次,考虑到第一个和第二个问题已得到解决。

于 2012-11-25T12:53:07.020 回答