You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:24:03