MySQL中能否创建触发器根据JSON值选择插入目标表?
你的MySQL触发器实现不可行,存在这些问题&修正方案
咱们直接说结论:你写的这个触发器没办法正常工作,而且有几个关键问题需要修正,我给你逐一拆解并给出优化后的代码:
存在的核心问题
- 语法错误:MySQL中每个SQL语句结尾必须加
;,你的INSERT语句、END IF都没加,会直接导致创建触发器失败。 - 无限递归风险:触发器是在
tabla2上的AFTER INSERT触发,而你在ELSE分支里又向tabla2插入数据,这会触发同一个触发器,陷入无限循环,最终导致数据库报错甚至崩溃。 - JSON函数冗余:
JSON_UNQUOTE(JSON_EXTRACT(nombre, '$.Name'))可以简化成MySQL的原生简化写法nombre->>'$.Name',功能完全一致但代码更简洁。 - 拼写错误:触发器名称
testingtirggerjson4里的tirgger是拼写错误(应该是trigger),虽然不影响功能,但不利于后续维护。
修正后的触发器代码
DELIMITER # CREATE TRIGGER tetsingschema.testingtriggerjson4 AFTER INSERT ON tabla2 FOR EACH ROW BEGIN -- 简化JSON字段取值写法 IF (NEW.nombre->>'$.Name' = 'Bart') THEN INSERT INTO tabla3(nombre) VALUES ('insert 1'); -- 补充分号 ELSE -- 替换为非触发表避免递归,比如tabla4 INSERT INTO tabla4(nombre) VALUES ('insert 2'); END IF; -- 补充分号 -- 注意:如果保留这条插入tabla2的语句,依然会触发递归,建议移除或添加防护逻辑 -- INSERT INTO tabla2(nombre) VALUES ('insert 2'); END # DELIMITER ;
额外优化建议
如果你确实需要操作触发表tabla2,可以改用BEFORE INSERT触发器直接修改待插入的字段值,避免重复插入导致的递归:
DELIMITER # CREATE TRIGGER tetsingschema.testingtriggerjson4 BEFORE INSERT ON tabla2 FOR EACH ROW BEGIN IF (NEW.nombre->>'$.Name' = 'Bart') THEN SET NEW.nombre = JSON_SET(NEW.nombre, '$.Name', 'insert 1'); ELSE SET NEW.nombre = JSON_SET(NEW.nombre, '$.Name', 'insert 2'); END IF; END # DELIMITER ;
内容的提问来源于stack exchange,提问作者Oscar Perez
相关产品推荐
相关产品推荐

