日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2025/3/12 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL——JSON_REPLACE()函数修改JSON属性值 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

由于對(duì)mysql的函數(shù)并不了解,之前遇到了一個(gè)場(chǎng)景:

mysql表中有一個(gè)字段res_content 是一個(gè)由longtext類(lèi)型(可以理解為一個(gè)更長(zhǎng)的varchar)保存的巨大的JSON對(duì)象,但是,由于錄入的疏忽,導(dǎo)致這個(gè)json對(duì)象中的有一個(gè)屬性值錯(cuò)誤,需要重新修改這個(gè)json對(duì)象的屬性值,于是,我將整個(gè)json對(duì)象,也就是res_content字段重新替換了一遍。=。= |||?

一個(gè)json中小小的屬性需要更新,卻要替換整個(gè)json對(duì)象,僅僅因?yàn)樗跀?shù)據(jù)庫(kù)中是以一個(gè)字段存儲(chǔ)的!!?這也太傻吊了!

這樣做雖然簡(jiǎn)單粗暴,但很明顯不符合我追求完美的性格,既然只有一個(gè)屬性出錯(cuò),那為什么不能直接替換這個(gè)JSON中具體的屬性呢?而且這樣的解決辦法,如果處理上千萬(wàn)條JSON還可以減小mysql的性能開(kāi)銷(xiāo),豈不美哉!?

當(dāng)時(shí)并沒(méi)有及時(shí)想到mysql函數(shù),實(shí)際上mysql現(xiàn)在已經(jīng)支持了大量的JSON字符串的操作函數(shù),可以支持基本的需求。這也是我偶然間瀏覽我的關(guān)注里面的博文一個(gè)大神提供給我的思路:《mysql替換某字段中的部分值》,所以非常感謝這位博主。

不過(guò),這個(gè)博主的文章只是替換已知字符串的值,比如 :http 改成 https,但對(duì)于json字符串,我們要想替換key所對(duì)應(yīng)的value就涉及到兩步:查詢(xún)和替換,很明顯,他這篇博客并不符合我的需求,不過(guò)確實(shí)給我提供了一個(gè)查閱mysql函數(shù)的思路。下面就來(lái)簡(jiǎn)單說(shuō)說(shuō)MySQL中用于替換JSON屬性值的這個(gè)函數(shù):JSON_REPLACE(json_doc,?path,?val[,?path,?val] ...)

官方描述

JSON_REPLACE():

官方的第一句解釋是:Replaces existing values in a JSON document and returns the result。就沖這句話(huà),基本可以鎖定它就是我要找的解決方案。我們來(lái)看一下官方的示例:

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]} | +-----------------------------------------------------+

上面的例子很好理解,首先,它定義了一個(gè)JSON字符串變量,然后通過(guò)JSON_REPLACE函數(shù)將這個(gè)變量中的屬性a的值由1 改為了10,然后將屬性c的值改為了‘[true, false]’,但由于json字符串中并沒(méi)有屬性 c 因此只有屬性 a 修改成功了。(這里需要注意,mysql函數(shù)僅僅是做數(shù)據(jù)轉(zhuǎn)換,并不涉及到真正的增刪改查,因此還需要配合具體的UPDATE才能夠真正更新數(shù)據(jù))

看過(guò)這個(gè)例子之后,我思考了一下我的應(yīng)用場(chǎng)景,只需要在更新的sql語(yǔ)句中調(diào)用JSON_REPLACE函數(shù),將json對(duì)象所對(duì)應(yīng)的字段比作上面的JSON字符串變量,然后通過(guò) ‘$xxx’ 匹配到我所希望修改的值,然后就可以成功修改JSON對(duì)象中的屬性了。

驗(yàn)證測(cè)試

現(xiàn)在我有一張employee表,它的last_name字段是一個(gè)簡(jiǎn)單的JSON字符串:

現(xiàn)在,我希望修改emp_id = 1的記錄,將這條記錄中l(wèi)ast_name中的name改成“Harry”,gender改成 “”。于是我執(zhí)行了下面的SQL:

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

這里注意,我特意將 "$.gender" 寫(xiě)為雙引號(hào),目的就是為了測(cè)試這樣的通配是否可以生效,執(zhí)行成功后,查詢(xún)結(jié)果如下:

可以看到,last_name字段中的name屬性已經(jīng)修改成Harry,gender也被修改成了“女”,因此通配符 用雙引、單引都是可以的。

除了JSON_REPLACE()函數(shù),還有很多其他的json函數(shù),如JSON_REMOVE()等,具體函數(shù)用法可以查看官方文檔:

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

里面還貼心的將用法進(jìn)行了歸類(lèi):

但是,這些函數(shù)應(yīng)該都對(duì)mysql數(shù)據(jù)庫(kù)的版本比較敏感,一般對(duì)MySQL5.7以上的版本支持比較理想,個(gè)別函數(shù)可能需要5.7.8以上,我的數(shù)據(jù)庫(kù)是5.7.23,因此JSON_REPLACE()用著還可以,如果你的版本在5.7以下,就得好好看看是否支持這些函數(shù)了。

簡(jiǎn)單查看MySQL數(shù)據(jù)庫(kù)的版本:SELECT VERSION();

綜上,就是關(guān)于如何修改JSON字符串中屬性值的函數(shù)JSON_REPLACE()的簡(jiǎn)單介紹,歡迎文末留言。?

總結(jié)

以上是生活随笔為你收集整理的MySQL——JSON_REPLACE()函数修改JSON属性值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。