MySQL UPDATE触发器语法报错咨询:设置旧字段值至新字段失败
问题
我编写了两段MySQL BEFORE UPDATE触发器代码:
第一段:
CREATE TRIGGER update_after_requirement_on_description BEFORE UPDATE ON requirement FOR EACH ROW BEGIN IF !(NEW.description <=> OLD.description) THEN UPDATE requirement SET NEW.description_previous = OLD.description; END IF; END;
第二段:
CREATE TRIGGER update_after_requirement_on_description BEFORE UPDATE ON requirement FOR EACH ROW IF !(NEW.description <=> OLD.description) THEN UPDATE requirement SET NEW.description_previous = OLD.description; END IF;
执行这两段代码时,数据库均返回错误:#1064 - 语法错误,位置靠近语句"SET NEW.description_previous = OLD.description;"。修改为以下含DELIMITER的版本后可正常运行:
DELIMITER $$ CREATE TRIGGER update_after_requirement_on_description BEFORE UPDATE ON requirement FOR EACH ROW IF !(NEW.description <=> OLD.description) THEN SET NEW.description_previous = OLD.description; END IF; $$ DELIMITER ;
请问原代码的错误原因是什么?
错误原因分析
原代码的核心问题是MySQL默认语句分隔符(;)的冲突:
- MySQL客户端默认以
;作为SQL语句的结束标记,当触发器定义中包含嵌套语句块(比如IF内部的SET语句),客户端会在遇到第一个;时就截断代码,把SET NEW.description_previous = OLD.description;当作独立语句执行,这完全不符合触发器的语法结构,直接触发1064语法错误。 - 第一段代码还存在额外错误:触发器内修改当前行不需要写
UPDATE requirement,直接通过NEW.字段名赋值即可,多余的UPDATE语句会进一步打乱语法解析逻辑。
使用DELIMITER $$重新定义分隔符后,客户端会把$$作为整个触发器定义的结束标记,直到遇到$$才会提交完整的触发器代码给服务器解析,这样就能正确识别内部的嵌套语句结构,避免分隔符冲突导致的语法错误。
内容的提问来源于stack exchange,提问作者Pawel W
相关产品推荐
相关产品推荐

