MySql-触发器不';I don’我没有按预期运行
MySql触发器新手,只是学习而已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
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,结果相同。为什么这样会更好呢?