问题:修改mysql中某个字段,json格式数据中的值

  • Post author:
  • Post category:mysql


生产环境场景:一张mysql数据表,有一个String/text类型字段,存储的json格式数据,现在要对json数据做修改(比如:根据条件对endDate的值做修改),如何实现?

举例:表结构如下(简写的样板),其中sync_info字段存储的是json格式数据

CREATE TABLE `oms_order_sync_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `oms_order_no` varchar(100) NOT NULL COMMENT 'OMS订单编号',
  `sync_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '同步状态:0-失败,1-成功',
  `sync_info` text NOT NULL COMMENT '同步信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx` (`oms_order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='oms订单-同步异常日志表';
sync_info字段存储的是json格式数据(简写的样板)

{
    "omsOrderNo":"oms12345678",
    "createTime":"2021-12-07 12:56:49",
    "detailList":[
        {
  
            "endDate":"2021-11-22 00:00:00",
            "skuCode":"111111",
            "productDate":"2021-11-22 00:00:00"
        
        },
        {
            "endDate":"2021-10-11 00:00:00",
            "skuCode":"222222",
            "productDate":"2021-10-11 00:00:00"
        },
        {
            "endDate":"2021-09-11 00:00:00",
            "skuCode":"333333",
            "productDate":"2021-09-11 00:00:00"
        }
    ],
    "orderType":"1"
}



一、方法一(在后端写代码实现):

写的代码需要上线(拉分支发布紧急版本,不推荐)

后端读取数据库,解析修改数据,再update,很简单,略。



二、方法二(纯mysql脚本实现):

生产执行纯sql脚本(mysql版本需要支持json函数,脚本比较复杂)


  • 例子1

    (不需要json中条件,只修改某个值):
//将oms_order_no= '传条件oms订单号'的所有记录,替换sync_info字段中,key为detailList的第一个对象中属性endDate的value值
UPDATE oms_order_sync_log
SET sync_info = json_set( sync_info, "$.detailList[0].endDate", "2021-12-22 00:00:00" ) 
WHERE
	oms_order_no= '传条件oms订单号';

  • 例子2

    (不需要条件,只修改某个值):



三、方法三(后端写代码 + mysql脚本实现):

写的代码不需要上线,把正确的数据刷到生产(推荐)

步骤1:把生产数据库的sql导出来,如: xxx.sql

步骤2:把 xxx.sql 导入到开发数据库

步骤3:在本地开发环境写代码,把 xxx.sql中的数据,改正确(

前提:数据量大



步骤4:把开发数据库中,改正确的sql导出来

步骤5:把正确的数据更新到生产数据库



四、方法四(手动改数据 + mysql脚本实现):

步骤1:把生产数据库的sql导出来,如: xxx.sql

步骤2:把 xxx.sql 导入到开发数据库

步骤3:本地开发环境,手动把 xxx.sql中的数据,改正确(

前提:数据量很少



步骤4:把开发数据库中,改正确的sql导出来

步骤5:把正确的数据更新到生产数据库



版权声明:本文为SeniorShen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。