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

MySQL中AFTER UPDATE触发器更新_history列报错求助

问题分析

错误Invalid target for assignment in INSERT or UPDATE statement 'NEW._history'的核心原因是触发器写法错误:

  • 不管是BEFORE UPDATE还是AFTER UPDATE,都不能用UPDATE _users SET NEW._history = ...这种语法。BEFORE触发器只需直接修改NEW对象的字段值(修改后的数据会自动写入表);AFTER触发器中NEW已是写入表的最终数据,无法修改,且此时更新同表会触发循环调用。
  • 手动拼接JSON字符串极易出现转义错误和格式问题,应该用MySQL原生JSON函数处理。
修正后的触发器代码
CREATE DEFINER = `root`@`localhost` TRIGGER `update_history` BEFORE UPDATE
ON `_users` FOR EACH ROW
BEGIN
    IF NEW.is_active <> OLD.is_active OR NEW.is_deleted <> OLD.is_deleted THEN
        -- 处理_history字段初始为NULL的情况,先转为空数组再追加记录
        SET NEW._history = JSON_ARRAY_APPEND(
            IFNULL(OLD._history, '[]'),
            '$',
            JSON_OBJECT(
                'date', NOW(),
                'username', OLD.username,
                'is_active', OLD.is_active,
                'is_deleted', OLD.is_deleted
            )
        );
    END IF;
END;
关键修改说明
  • 改用BEFORE UPDATE触发器:直接通过SET NEW._history = ...修改待写入的字段值,无需额外执行UPDATE语句,行级触发会自动将修改后的NEW数据写入当前行。
  • 使用JSON_OBJECT()构造标准JSON对象:避免手动拼接字符串的转义错误,保证JSON格式合法。
  • 新增IFNULL(OLD._history, '[]'):处理_history字段初始为NULL的场景,确保JSON_ARRAY_APPEND能正常追加元素。

内容的提问来源于stack exchange,提问作者Hajitsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:17