如何更新MySQL longtext类型字段中的JSON数据
访问并更新MySQL JSON数组中的单个键值对
没问题,我来帮你搞定MySQL里JSON数组的访问和更新!你的jsonData字段是一个包含单个对象的JSON数组,所以需要先用数组索引定位到对象,再操作里面的键值对,下面分步骤给你讲:
一、访问单个键值对
因为你的JSON是数组结构,所以要先通过$[0]定位到数组的第一个元素(MySQL中JSON数组索引从0开始),再用.键名获取对应的值。
两种常用方式:
- 使用箭头运算符
->(返回带引号的字符串):
SELECT jsonData->'$[0].dstPort' AS dst_port FROM ApplicationEntity WHERE name = 'some_name';
执行后会返回"2345"(带双引号)。
- 使用
->>运算符(返回不带引号的原始值,等价于JSON_UNQUOTE(JSON_EXTRACT(...))):
SELECT jsonData->>'$[0].dstPort' AS dst_port FROM ApplicationEntity WHERE name = 'some_name';
执行后会返回2345(无引号)。
如果你习惯用函数写法,也可以用JSON_EXTRACT:
SELECT JSON_EXTRACT(jsonData, '$[0].description') AS description FROM ApplicationEntity WHERE name = 'some_name';
二、更新单个键值对
要更新数组内对象的键值对,MySQL提供了JSON_SET和JSON_REPLACE两个常用函数,它们的区别是:
JSON_SET:如果键不存在则添加,存在则替换JSON_REPLACE:只替换已存在的键,不存在则不做操作
示例1:替换已存在的键(比如把dstPort从2345改成4567)
UPDATE ApplicationEntity SET jsonData = JSON_SET(jsonData, '$[0].dstPort', '4567') WHERE name = 'some_name';
执行完可以用上面的查询语句验证是否更新成功。
示例2:添加新的键值对(比如给对象加一个priority键,值为"high")
UPDATE ApplicationEntity SET jsonData = JSON_SET(jsonData, '$[0].priority', 'high') WHERE name = 'some_name';
更新后你的JSON数据会变成:
[{"name":"some_name","description":"good_description","gla":"None","srcPort":"123","dstPort":"4567","disableTimeout":false,"priority":"high"}]
注意事项:
- 确保你的MySQL版本是5.7及以上,因为JSON函数是从5.7版本开始支持的
- 一定要加
WHERE条件,否则会更新表中所有行的jsonData字段 - 如果数组中有多个元素,只需要把索引
[0]改成对应的位置(比如[1]操作第二个元素)
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

