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

MariaDB/MySQL中移除JSON数组指定元素及清除空对象方法

解决MariaDB/MySQL中JSON数组移除指定元素的问题

针对user_pst_tb表中pst_id=30的pst_liked_by字段(存储JSON数组[{"uid":5},{"uid":6},{"uid":7}]),要移除{"uid":6}且不遗留空对象,推荐以下两种可靠方案:

方案一:拆解数组过滤后重组(兼容所有位置,支持批量删除)

通过JSON_TABLE将JSON数组拆分为行数据,过滤掉目标元素后,再用JSON_ARRAYAGG重新拼接成数组,完全避免空对象问题:

UPDATE user_pst_tb
SET pst_liked_by = (
    SELECT JSON_ARRAYAGG(elem)
    FROM JSON_TABLE(
        pst_liked_by,
        '$[*]' COLUMNS (elem JSON PATH '$')
    ) AS jt
    WHERE JSON_EXTRACT(elem, '$.uid') != 6
)
WHERE pst_id = 30;

如果数组中存在多个uid=6的元素,该语句会自动过滤所有匹配项,无需额外修改。

方案二:精准定位元素路径后删除(适用于单元素删除)

先通过JSON_SEARCH找到目标元素的数组索引路径,再用JSON_REMOVE直接删除该元素:

步骤1:验证目标元素路径(可选)

SELECT JSON_SEARCH(pst_liked_by, 'one', 6, NULL, '$[*].uid') 
FROM user_pst_tb 
WHERE pst_id = 30;

该语句会返回类似'$[1].uid'的结果,其中$[1]就是目标元素在数组中的位置。

步骤2:执行删除更新

UPDATE user_pst_tb
SET pst_liked_by = JSON_REMOVE(
    pst_liked_by,
    REPLACE(JSON_SEARCH(pst_liked_by, 'one', 6, NULL, '$[*].uid'), '.uid', '')
)
WHERE pst_id = 30;

若要删除所有uid=6的元素,可将JSON_SEARCH中的'one'改为'all',但方案一处理批量删除更简洁。

问题根源说明

之前操作遗留空对象{},大概率是错误使用JSON_SET将元素置为空对象而非真正移除,或是拆解数组时未正确过滤导致空行被重新聚合。上述两种方案从根源避免了这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:50:31