文章插图
网图侵删
场景描述不知道各位小伙伴有没有遇到过这样的情况:MySQL表中有一个字段res_content 是一个由longtext类型(可以理解为一个更长的varchar)保存的巨大的JSON对象,但是,由于录入的疏忽,导致这个json对象中的有一个属性值错误,需要重新修改这个json对象的属性值,于是,你就不得不将整个json对象,也就是res_content字段重新替换了一遍 。= 。= |||
一个json中小小的属性需要更新,却要替换整个json对象,仅仅因为它在数据库中是以一个字段存储的!!?这也太傻x了!
我是拒绝的这样做虽然简单粗暴,但很明显不符合我追求完美的性格,既然只有一个属性出错,那为什么不能直接替换这个JSON中具体的属性呢?而且这样的解决办法,如果处理上千万条JSON还可以减小mysql的性能开销,岂不美哉!?
JSON_REPLACE(...)官方描述
【数据库JSON怎么改?一个SQL函数让你的操作瞬间高大上】官方的第一句解释是:Replaces existing values in a JSON document and returns the result 。就冲这句话,基本可以锁定它就是我要找的解决方案 。我们来看一下官方的示例:
文章插图
案例一
上面的例子很好理解,首先,它定义了一个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字符串:
文章插图
employee表
现在,我希望修改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()等,具体函数用法可以查看官方文档 。
里面还贴心的将用法进行了归类:
文章插图
mysql官方文档
但是,这些函数应该都对mysql数据库的版本比较敏感,一般对MySQL5.7以上的版本支持比较理想,个别函数可能需要5.7.8以上,我的数据库是5.7.23,因此JSON_REPLACE()用着还可以,如果你的版本在5.7以下,就得好好看看是否支持这些函数了 。
简单查看MySQL数据库的版本:SELECT VERSION();
文章插图
mysql版本号
综上,就是关于如何修改JSON字符串中属性值的函数JSON_REPLACE()的简单介绍,欢迎文末留言 。
推荐阅读
- 数据库连接池的原理
- 淘宝直播如何快速增加亲密度,视频 淘宝直播间亲密度怎么提升
- 怎么检测淘宝店铺是否被降权 淘宝怎么看宝贝有没有降权
- 孔府宴酒怎么样 孔府宴酒特点
- 淘宝号被降权应该怎么办 淘宝号降权是怎么回事
- 唐三藏前九世怎么死的 沙僧杀了唐僧9世吗
- 直播怎样吸粉 淘宝直播怎么吸粉
- 健康饮食怎么吃,8句话全说清楚了!
- 跳槽后面试,被问:你原来那家公司很好,怎么不做啦,该怎么回答
- 汽车胎压2.5才正常?别再被忽悠了,听听老司机怎么说。