MySQL对JSON数据内对象进行更新

sql 复制代码
UPDATE
  表名
SET
  字段名 = 
  CASE WHEN
  JSON_EXTRACT(字段名,'$.字段里的对象名.对象内部字段名') IS NOT NULL
  THEN
  JSON_SET (
    字段名,
    "$.字段里的对象.对象内部字段",
    更新后的值
  )
  ELSE
   JSON_INSERT (
    字段名,
    "$.字段里的对象名",
    JSON_OBJECT("对象内部字段名",更新后的值)
  )
  END;
WHERE
  具体条件

以上SQL用于更新JSON结构数据内部的对象,不存在则插入,非对象的键值、对象多层嵌套同理,业务复杂时建议使用java代码转换为JSONObject处理。

例如存在 bill 账单表,定义了 text 类型的字段 bill_extension 以存储JSON数据,有一条数据为 {"customerCode": "a", "commodity": {"price": 10,"num":1}} ,把 commodity 对象里的 price 改为20。

sql 复制代码
UPDATE
  bill
SET
  bill_extension = 
  CASE WHEN
  JSON_EXTRACT(bill_extension,'$.commodity.price') IS NOT NULL
  THEN
  JSON_SET (
    bill_extension,
    "$.commodity.price",
    20
  )
  ELSE
   JSON_INSERT (
    bill_extension,
    "$.commodity",
    JSON_OBJECT("price",20)
  )
  END
WHERE
  id = 1;

注意点:

1.请根据具体业务情况替换代码的中文注释,并确认存储数据符合JSON格式。

2.MySQL5.7以下版本不支持JSON相关函数。

3.更新后JSON数据会按照一定规则重新排序,暂不了解具体细节,有知道的朋友欢迎指点。

4.JSON相关函数介绍推荐以下博客

【MySQL】对JSON数据操作(全网最全)_mysql json_0世界和平0的博客-CSDN博客

相关推荐
Go_error6 分钟前
那个让我们损失了 47,000 美元 AWS 账单的互斥锁错误
后端
Go_error9 分钟前
接口何时冗余:一种用于 Go 测试的精简依赖注入方法
后端
鱼弦9 分钟前
长尾场景的挑战:大模型如何处理极其冷门的知识?
后端
孙启超11 分钟前
【AI开发之Rust】第 8 课:泛型、trait 与 trait 对象
开发语言·后端·rust
得物技术11 分钟前
指标平台:从语义底座到智能消费的实践路径|得物技术
数据库·人工智能·ai编程
co松柏13 分钟前
一文吃透 Pi:10w stars 的极简 Agent harness
后端·架构
StarRocks_labs19 分钟前
当大模型调用进入执行引擎:StarRocks AI Function 全新能力解析
数据库·starrocks·sql·ai·pipeline·数据处理·join
开心麻瓜19 分钟前
一条 SQL 跑了 8 秒,优化到 200ms 的全过程
mysql
joinwell5220 分钟前
没收到回复,再点一次会启动两个 AI 吗?
人工智能·后端
TDengine (老段)26 分钟前
TDengine 常见问题 TOP4
数据库·物联网·时序数据库·tdengine·涛思数据·升级·tdengine 问题