MySQL编写BEFORE UPDATE触发器报1064语法错误求修正
问题排查与修正方案
你遇到的1064语法错误和逻辑问题主要有以下几点:
- 语法错误:MySQL多分支条件关键字为
ELSEIF(无空格),你使用带空格的ELSE IF会被识别为嵌套IF,缺少对应END IF闭合,直接触发语法报错 - 条件逻辑错误:
STRCMP(a,b)=0代表两个字符串相等,你当前的判断逻辑是字段未修改时才拼接提示,完全写反 - 分支逻辑错误:使用
ELSEIF会让多字段同时修改的场景只能匹配第一个被修改的字段,无法记录所有变更字段 - 操作位置错误:你将
DELETE和INSERT操作写在了最后一个ELSE分支里,只有修改emonthlysalary时才会执行日志写入,修改其他字段不会触发日志操作
修正后的完整代码
DELIMITER // CREATE TRIGGER update_col BEFORE UPDATE ON Employee FOR EACH ROW BEGIN DECLARE Msg VARCHAR(100); SET Msg = ''; -- 独立判断每个字段是否被修改,支持多字段变更同时记录 IF NEW.eid != OLD.eid THEN SET Msg = CONCAT(Msg, 'trying to update eid; '); END IF; IF STRCMP(NEW.ename, OLD.ename) != 0 THEN SET Msg = CONCAT(Msg, 'trying to update ename; '); END IF; IF STRCMP(NEW.eaddress, OLD.eaddress) != 0 THEN SET Msg = CONCAT(Msg, 'trying to update eaddress; '); END IF; IF NEW.emonthlysalary != OLD.emonthlysalary THEN SET Msg = CONCAT(Msg, 'trying to update emonthlysalary; '); END IF; -- 只有存在字段变更时才写入日志 IF Msg != '' THEN DELETE FROM Update_Message; INSERT INTO Update_Message (Message) VALUES (Msg); END IF; END // DELIMITER ;
如果不需要每次清空Update_Message表只保留最新一条变更记录,可以去掉DELETE FROM Update_Message;这行,保留所有历史变更日志。
内容的提问来源于stack exchange,提问作者Baha Dawood ud-Din Rehman
相关产品推荐
相关产品推荐

