MySQL 5.7中如何实现JSON数组对象的去重追加更新?
MySQL 5.7实现JSON数组去重追加的方法
MySQL 5.7没有内置的带去重判断的JSON数组追加函数,需要通过组合现有函数实现需求,具体步骤如下:
核心思路
先通过JSON_CONTAINS判断新对象是否已存在于数组中,仅当不存在时执行追加操作。
具体实现
1. 直接使用字面量更新
UPDATE your_table SET col = CASE -- 判断新对象是否存在于数组col中 WHEN JSON_CONTAINS(col, '{"a": "a_value_1", "b": "b_value_1"}') THEN col -- 不存在则追加到数组末尾 ELSE JSON_ARRAY_APPEND(col, '$', '{"a": "a_value_1", "b": "b_value_1"}') END -- 替换为你的过滤条件,比如指定某条记录 WHERE id = 1;
2. 使用变量传递新对象
如果新对象的内容是动态的,推荐用JSON_OBJECT构造对象并赋值给变量,提升可读性:
-- 构造新对象 SET @new_obj = JSON_OBJECT('a', 'a_value_1', 'b', 'b_value_1'); UPDATE your_table SET col = CASE WHEN JSON_CONTAINS(col, @new_obj) THEN col ELSE JSON_ARRAY_APPEND(col, '$', @new_obj) END WHERE id = 1;
注意事项
JSON_CONTAINS会严格匹配对象的键值对和键的顺序,若新对象的键顺序与数组中现有对象不同(比如{"b": "b_value_1", "a": "a_value_1"}),会被判定为不同对象。如果需要忽略键顺序,需要额外将对象转换为排序后的字符串进行比较,逻辑会更复杂。- 确保
col列的类型是JSON,否则JSON_CONTAINS等函数无法正常工作。
内容的提问来源于stack exchange,提问作者Aloof aloof
相关产品推荐
相关产品推荐

