生产环境场景:一张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 版权协议,转载请附上原文出处链接和本声明。