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博客

相关推荐
wuqingshun3141598 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
星栈9 小时前
深度复盘:比 EventLoop 更隐蔽!Node 微任务堆积引发的线上接口雪崩事故
后端·node.js
空中湖9 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
名字还没想好☜9 小时前
Go slice 的 append 陷阱:共享底层数组导致的数据串改
开发语言·后端·golang·go·slice
诸神缄默不语9 小时前
FastAPI后端配置CORS中间件支持浏览器跨域访问
后端·fastapi
Fanta丶9 小时前
14.Activiti7 网关 排他网关ExclusiveGateway、并行网关ParallelGateway
后端
明月_清风10 小时前
robots.txt 完全指南:从入门到精通
后端·爬虫
jvmind_dev10 小时前
Java GC 实战指南(番外篇):被忽视的隐形杀手 —— Class Unloading 如何拖垮 GC
java·后端
明月_清风10 小时前
从零写一个"像人"的爬虫:反爬攻防实战指南
后端·爬虫
贰先生10 小时前
Xiuno BBS 审计之问题13:管理员发帖 doctype=0 时存储型 XSS
后端