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

如何在MySQL中替换JSON键的值?附JSON列数据实例

嘿,我来帮你搞定MySQL JSON列替换指定键值的问题!看你给出的示例数据,你的JSON列是个包含多个对象的数组,每个对象里嵌套了不同的report类键——比如你提到的report4的details字段需要替换对吧?下面分几种常见场景给你实用的解决方案:

1. 替换数组中所有匹配键的值

如果你想把数组里所有对象中的report4->details值都替换成新内容(不管它在数组的哪个位置),可以借助MySQL 8.0+的JSON_TABLE函数把数组拆成单独的对象行,处理后再重组为数组。

假设你的表名叫test_table,JSON列是json_data,要把所有report4.details替换为<b>Updated details here</b>,可以用下面的更新语句:

UPDATE test_table t
JOIN (
  SELECT 
    id, 
    JSON_ARRAYAGG(
      CASE 
        WHEN JSON_EXTRACT(item, '$.report4') IS NOT NULL THEN 
          JSON_REPLACE(item, '$.report4.details', '<b>Updated details here</b>')
        ELSE item 
      END
    ) AS updated_json
  FROM test_table,
       JSON_TABLE(json_data, '$[*]' COLUMNS (item JSON PATH '$')) AS jt
  GROUP BY id
) AS sub ON t.id = sub.id
SET t.json_data = sub.updated_json;

逻辑解释:

  • JSON_TABLE(json_data, '$[*]' ...):把JSON数组里的每个对象拆成独立的行,方便逐个处理。
  • CASE判断:如果当前对象包含report4键,就用JSON_REPLACE替换它的details值;否则保持原对象不变。
  • JSON_ARRAYAGG:把处理后的所有对象重新拼成一个数组,覆盖原JSON列的值。
2. 替换数组中特定位置的键值

如果你明确知道要修改的对象在数组中的位置(比如数组第2个元素,MySQL JSON数组索引从0开始),可以直接用JSON_REPLACE定位路径修改:

UPDATE test_table
SET json_data = JSON_REPLACE(
  json_data, 
  '$[1].report4.details', -- 定位到数组索引1的对象下的report4.details
  '<b>Updated specific details</b>'
)
WHERE id = 1; -- 替换指定行,根据你的实际条件调整

这种方式简单直接,适合目标位置明确的场景。

3. 替换某个键下的特定旧值

如果你只想替换report4.details中等于某个特定旧值的内容(比如只替换值为<b>We need to show the details here</b>的条目),可以在判断逻辑里加上旧值匹配:

UPDATE test_table t
JOIN (
  SELECT 
    id, 
    JSON_ARRAYAGG(
      CASE 
        WHEN JSON_UNQUOTE(JSON_EXTRACT(item, '$.report4.details')) = '<b>We need to show the details here</b>' THEN 
          JSON_REPLACE(item, '$.report4.details', '<b>New targeted details</b>')
        ELSE item 
      END
    ) AS updated_json
  FROM test_table,
       JSON_TABLE(json_data, '$[*]' COLUMNS (item JSON PATH '$')) AS jt
  GROUP BY id
) AS sub ON t.id = sub.id
SET t.json_data = sub.updated_json;

这里用JSON_UNQUOTE把提取出的JSON字符串去掉引号,才能和普通字符串做等值比较。

重要注意事项
  • 确保你的MySQL版本是8.0及以上:JSON_TABLE是8.0新增的函数,5.7及以下版本不支持,低版本处理数组需要用存储过程循环,会麻烦很多。
  • 区分JSON_REPLACE和JSON_SET:JSON_REPLACE只替换已存在的键;如果要给没有report4的对象新增这个键及其值,就把JSON_REPLACE换成JSON_SET。
  • 处理转义字符:你的示例里有&lt;这类HTML转义字符,MySQL的JSON类型会自动处理转义逻辑,直接写入<b>这样的原始内容即可,存储时会自动转义为符合JSON规范的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:07