MySQL——JSON_REPLACE()函数修改JSON属性值

引言

由于对mysql的函数并不了解,之前遇到了一个场景:

mysql表中有一个字段res_content 是一个由longtext类型(可以理解为一个更长的varchar)保存的巨大的JSON对象,但是,由于录入的疏忽,导致这个json对象中的有一个属性值错误,需要重新修改这个json对象的属性值,于是,我将整个json对象,也就是res_content字段重新替换了一遍。=。= ||| 

一个json中小小的属性需要更新,却要替换整个json对象,仅仅因为它在数据库中是以一个字段存储的!!?这也太傻吊了!

这样做虽然简单粗暴,但很明显不符合我追求完美的性格,既然只有一个属性出错,那为什么不能直接替换这个JSON中具体的属性呢?而且这样的解决办法,如果处理上千万条JSON还可以减小mysql的性能开销,岂不美哉!?

当时并没有及时想到mysql函数,实际上mysql现在已经支持了大量的JSON字符串的操作函数,可以支持基本的需求。这也是我偶然间浏览我的关注里面的博文一个大神提供给我的思路:《mysql替换某字段中的部分值》,所以非常感谢这位博主。

不过,这个博主的文章只是替换已知字符串的值,比如 :http 改成 https,但对于json字符串,我们要想替换key所对应的value就涉及到两步:查询和替换,很明显,他这篇博客并不符合我的需求,不过确实给我提供了一个查阅mysql函数的思路。下面就来简单说说MySQL中用于替换JSON属性值的这个函数:JSON_REPLACE(json_docpathval[, pathval] ...)

官方描述

JSON_REPLACE():

官方的第一句解释是:Replaces existing values in a JSON document and returns the result。就冲这句话,基本可以锁定它就是我要找的解决方案。我们来看一下官方的示例:

mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
mysql> SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');
+-----------------------------------------------------+
| JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]') |
+-----------------------------------------------------+
| {"a": 10, "b": [2, 3]}                              |
+-----------------------------------------------------+

上面的例子很好理解,首先,它定义了一个JSON字符串变量,然后通过JSON_REPLACE函数将这个变量中的属性a的值由1 改为了10,然后将属性c的值改为了‘[true, false]’,但由于json字符串中并没有属性 c 因此只有属性 a 修改成功了。(这里需要注意,mysql函数仅仅是做数据转换,并不涉及到真正的增删改查,因此还需要配合具体的UPDATE才能够真正更新数据)

看过这个例子之后,我思考了一下我的应用场景,只需要在更新的sql语句中调用JSON_REPLACE函数,将json对象所对应的字段比作上面的JSON字符串变量,然后通过 ‘$xxx’ 匹配到我所希望修改的值,然后就可以成功修改JSON对象中的属性了。

验证测试

现在我有一张employee表,它的last_name字段是一个简单的JSON字符串:

现在,我希望修改emp_id = 1的记录,将这条记录中last_name中的name改成“Harry”,gender改成 “”。于是我执行了下面的SQL:

UPDATE employee 
SET last_name = json_replace(last_name, '$.name', "Harry", "$.gender", "女") 
WHERE emp_id = 1;

这里注意,我特意将 "$.gender" 写为双引号,目的就是为了测试这样的通配是否可以生效,执行成功后,查询结果如下:

可以看到,last_name字段中的name属性已经修改成Harry,gender也被修改成了“女”,因此通配符 用双引、单引都是可以的。

除了JSON_REPLACE()函数,还有很多其他的json函数,如JSON_REMOVE()等,具体函数用法可以查看官方文档:

https://dev.mysql.com/doc/refman/5.7/en/json-functions.html

里面还贴心的将用法进行了归类:

但是,这些函数应该都对mysql数据库的版本比较敏感,一般对MySQL5.7以上的版本支持比较理想,个别函数可能需要5.7.8以上,我的数据库是5.7.23,因此JSON_REPLACE()用着还可以,如果你的版本在5.7以下,就得好好看看是否支持这些函数了。

简单查看MySQL数据库的版本:SELECT VERSION();

综上,就是关于如何修改JSON字符串中属性值的函数JSON_REPLACE()的简单介绍,欢迎文末留言。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode算法入门- Remove Duplicates from Sorted Array -day21

LeetCode算法入门- Remove Duplicates from Sorted Array -day21 题目描述 Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do …

Spring Boot整合Redis——自定义RedisSerializer

引言 spring boot简单引入redis依赖,并使用RedisTemplate进行对象存储时,需要使存储对象实现Serializable接口,这样才能够成功将对象进行序列化。 RedisTemplate默认使用的序列化机制是JdkSerializationRedisSerializer,但实际开…

LeetCode算法入门- Implement strStr() -day22

LeetCode算法入门- Implement strStr() -day22 题目描述 Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Example 1: Input: haystack “hello”, needle “ll” Output: 2 Example …

交易系统如何确保账簿100%准确

转自廖雪峰老师的《交易系统如何确保账簿100%准确》 这篇文章阐述了一个交易系统中对账功能的关键,即:时刻保证资产负债表总额始终为 0。 交易系统中,对账是一个大问题。对账处理不好,不但需要花费大量的人力去处理账簿&#xff…

通俗易懂的SpringBoot教程---day1---Springboot入门教程介绍

通俗易懂的SpringBoot教程—day1—教程介绍 教程介绍: 初级教程: 一、 Spring Boot入门 二、 Spring Boot配置 三、 Spring Boot与日志 四、 Spring Boot与Web开发 五、 Spring Boot与Docker:Docker容器 六、 Spring Boot与数据访问&#x…

重装win11 23H2系统步骤及错误总结

1.分出大约13GB 的启动盘,下载win11 mul映像并解压进去 (记得下载电脑相应的网卡驱动!(只要等下进入桌面要用)) 2.利用easybcd, 到add选项,点击Win1PE,命名启动项&…

Java 8中获取参数名称

本文转自廖雪峰老师的:《在Java 8中获取参数名称》 在Java 8之前的版本,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形成了鲜明对比。现在,Java 8开始…

通俗易懂的SpringBoot教程---day2---Springboot配置文件

通俗易懂的SpringBoot教程—day2—Springboot配置文件 1、配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的; •application.properties •application.yml 配置文件的作用:修改SpringBoot自动配置的默认值;Spring…

英语中数字表达总结

引言 对于英语中千、万、亿的表达法,始终是我英语路上的一个痛点,今天就来好好总结一下这东西的规律。 一句话总结 阅读和理解层面(99%的使用情况):thousand后面跟 3 个 0 ,million后面跟 6 个 0 &#…

Kibana 的安装(Windows版本)新手入门

Kibana 的安装(Windows版本)新手入门 参考博文:https://blog.csdn.net/weixin_34727238/article/details/81200071 目录 什么是Kibana? Kibana 6.3.1安装条件 JDK的安装 node的安装 Elasticsearch的安装 Kibana 的安装 什么是Kibana?…

价值50万年薪的Java面试题

《Java面试题全集(上)》 《Java面试题全集(中)》 《Java面试题全集(下)》 《关于Java并发编程的总结和思考》 《面试编程题拾遗(01) --- 不用算术运算符完成两个数求和》 《面试…

Could not resolve host: 'localhost 报错解决办法

Could not resolve host: localhost 报错解决办法 面向Windows的: 零基础的我一直卡在这一步骤下: 首先要先在Windows安装curl:安装方式参考:https://blog.csdn.net/weixin_41986096/article/details/86646365 按照完之后&…

当面试官问我————为什么String是final的?

面试官:你好,能看得清下面这张图吗? 我:可以的。 面试官:恩,好的。呃,你能不能说一说为什么String要用final修饰? 我:final意味着不能被继承或者被重写,Str…

当面试官问我————Java是值传递还是引用传递?

面试官:你好,你能说出下面个程序的执行结果吗? public class Test {public static void main(String[] args) {String name "Scott";int age 5;User user new User();user.setName(name);user.setAge(age);System.out.println(…

ubuntu系统下Jenkins和tomcat的安装与配置

ubuntu 安装 JDK ubuntu的安装我们采取最简单的方式安装 直接用apt-get的方式 sudo apt-get install openjdk-8-jdk 安装器会提示你同意 oracle 的服务条款,选择 ok 然后选择yes 即可 ubuntu 安装tomcat8 通过apt安装 tomcat8 sudo apt-get install tomcat8 tomcat8-docs t…

String字符串拼接小例

>>>写出下面程序运行结果: public class StringTest {public static void main(String[] args) {String s1 "Programming";String a "Program";String b "ming";String s2 "Program" "ming";Stri…

看完这篇文章,还不懂nginx,算我输

看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格,以统一资源描述符(Uniform Resources Id…

Java并发编程实战————Executor框架与任务执行

引言 本篇博客介绍通过“执行任务”的机制来设计应用程序时需要掌握的一些知识。所有的内容均提炼自《Java并发编程实战》中第六章的内容。 大多数并发应用程序都是围绕“任务执行”来构造的:任务通常是一些抽象的且离散的工作单元。 当围绕“任务执行”来设计应…

一篇博客读懂设计模式之---工厂模式

设计模式之—工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); }创建实现类: public class Circle implements Shape {Overridepublic void draw() {System.out.println("this is a circle!"…

强健程序员体魄————减脂原理

一、基本概念 运动消耗:任何肌肉活动。 热量摄入:指人体从外界食物中获得的总的能量。 基础代谢:人体维持生命的所有器官所需要的最低能量需要。与人的年龄、性别、体型(肌肉量)、气温有关。简单说,一个…