MySQL 5.6迁移至8.0版本CREATE TRIGGER触发器语法报错问题
问题原因
- 语句分隔符冲突:MySQL 默认的语句结束分隔符是
;,你提供的触发器代码内部的 INSERT、SET 语句都用了;作为结束符,执行时 MySQL 解析到第 4 行的;就会认为整个CREATE TRIGGER语句已经结束,后续代码被直接截断,因此抛出 1064 语法错误。你在 5.6 版本可以正常执行,大概率是当时执行前临时修改了分隔符,迁移到 8.0 执行时遗漏了该配置。 - 保留字兼容性问题:MySQL 8.0 的保留字列表比 5.6 更丰富,代码里用到的
Log表名属于 8.0 新增的保留字范畴,没有用反引号包裹也可能触发语法报错。
适配MySQL 8.0的调整方案
执行触发器创建语句前先临时修改语句分隔符,同时对属于保留字的表名添加反引号包裹即可,修改后代码如下:
-- 临时修改语句分隔符为//,避免和触发器内部的;冲突 DELIMITER // CREATE TRIGGER `set_avatar_null` BEFORE UPDATE ON `mybb_users` FOR EACH ROW begin if new.uid = -1 then -- 保留字作为表名需要用反引号包裹 Insert Into `Log` (uid, Page, Params, Time) values (new.uid, 'set_avatar_null',new.avatar, NOW()); set new.avatar = '', new.avatardimensions=''; end if; end // -- 执行完成后改回默认分隔符; DELIMITER ;
如果你用 Navicat、phpMyAdmin 这类可视化工具创建触发器,工具会自动处理分隔符问题,仅需要将原代码中的Log修改为`Log`即可正常执行。
内容的提问来源于stack exchange,提问作者FDB
相关产品推荐
相关产品推荐

