如何在MySQL中拼接两个JSON数组?Error Code:3156报错解决方案
解决MySQL JSON数组合并的3156错误
你遇到的这个Error Code: 3156问题,本质是对MySQL中JSON类型的||操作符理解偏差了——它根本不是用来拼接JSON数组的!MySQL会把||当成数值运算的逻辑或(部分sql_mode下是字符串拼接,但对JSON列不生效),强行把你的JSON数组转成DOUBLE类型,自然就触发了转换错误。
下面给你两种靠谱的解决方法,根据你的MySQL版本选择:
方法1:用JSON_MERGE_PRESERVE(兼容MySQL 5.7+)
这是最直接的数组合并方式,会把两个JSON数组的元素全部合并到一起,保留所有元素(包括重复值,如果有的话)。执行语句如下:
UPDATE user_roles SET roles = JSON_MERGE_PRESERVE(roles, '[5,6]') WHERE id = ?1;
执行后你的roles列就会变成[1,2,3,4,5,6],完全符合预期。
方法2:用JSON_ARRAY_APPEND(适合追加单个/多个元素)
如果你的场景是要逐个追加元素,或者想明确指定追加位置,可以用这个函数。要追加整个数组的话,需要把数组拆成单个元素传入:
UPDATE user_roles SET roles = JSON_ARRAY_APPEND(roles, '$', 5, 6) WHERE id = ?1;
这里的'$'表示在数组的末尾追加元素,执行结果和上面的方法一致。
额外提示:如果需要去重合并
如果你的需求是合并数组同时去掉重复元素,可以结合JSON_TABLE和JSON_ARRAYAGG来实现,比如:
UPDATE user_roles ur JOIN ( SELECT id, JSON_ARRAYAGG(DISTINCT val) AS merged_roles FROM user_roles, JSON_TABLE(roles, '$[*]' COLUMNS(val INT PATH '$')) jt WHERE id = ?1 UNION ALL SELECT ?1 AS id, 5 UNION ALL SELECT ?1 AS id, 6 GROUP BY id ) t ON ur.id = t.id SET ur.roles = t.merged_roles;
这个语句会先把原数组展开,加上新元素,去重后再重新聚合为JSON数组,适合需要去重的场景。
内容的提问来源于stack exchange,提问作者CodeSphere
相关产品推荐
相关产品推荐

