MySql-触发器不';I don’我没有按预期运行

MySql-触发器不';I don’我没有按预期运行,mysql,triggers,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; 创建触发器MyTrigger 更新MyTable之后 每行 开始 如果(new.field15),则 更新新集n

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;
创建触发器MyTrigger
更新MyTable之后
每行
开始
如果(new.field1<0或new.field1>5),则
更新新集new.field1=old.field1;
如果结束;
结束;
目标是保持field1的值不变,如果更新使其超出范围。
但是,它将其设置为0。我做错了什么?这段代码应该是什么样子?

下面是一个示例,希望能帮助您开始:

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;
~
分隔符~
创建触发器'so_13547992_触发器`
更新'so_13547992'之前`
每行开始
如果(新建。`field1`<0或新建。`field1`>5),则
设置为新。`field1`=旧。`field1`;
如果结束;
结束;
~
为什么效果会更好?首先,您的示例触发器是递归的,您不能更新由更新触发的触发器中的同一个表

其次,您的
UPDATE
语句中的
new
不是表名,您需要明确指定一个表名

它似乎根本不是一个合法的触发器,当您尝试创建它时,您的服务器不会抱怨吗?你能不能实际显示
show CREATE TRIGGER`your_TRIGGER`
以确保它确实已创建,并且看起来像是您在上面粘贴的


即使您的示例可行,但您正在尝试对表的所有行执行无约束更新,而不是对您尝试更新的行,您应该有一个
WHERE
子句;同样,考虑到问题1和问题2已得到解决。

在更新之前尝试
,只需
new.field=old.field
而不使用
UPDATE
ing.Nope,结果相同。为什么这样会更好呢?