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

相关推荐
冉冰学姐4 分钟前
SSM校园二手物品交易系统051x4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·商品全流程管理
遇见火星10 分钟前
MySQL 5.7/8.0 物理备份实战:XtraBackup 全量+增量+验证+恢复
数据库·mysql·adb·xtrabackup·mysql8.0
老马952720 分钟前
MyBatis-Plus 动态表名的正确打开方式
后端·mybatis
妄汐霜26 分钟前
小白学习笔记(MySQL增删改查)
笔记·学习·mysql
咕噜企业分发小米28 分钟前
阿里云函数计算如何与ECS共享MySQL数据库?
数据库·mysql·阿里云
Java水解29 分钟前
springboot: Spring Boot 启动流程详解
spring boot·后端
马卡巴卡36 分钟前
为什么Spring不建议使用@Autowired?@Resource才是王道
后端
martin101736 分钟前
Oracle 11g 数据库卡顿排查与实战优化:一次真实的慢 SQL 定位全过程
数据库·后端
Linux Huang38 分钟前
spring注册组件/服务无效,问题排查
大数据·服务器·数据库·spring
SweetCode43 分钟前
汉诺塔问题
android·java·数据库