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
相关产品推荐
相关产品推荐

