mysql操作--json/數組 的增刪該查


前言,類型必須是json,雖然text也可以,但是很多操作沒法使用,比如查詢,當然了,這種類型還可以存儲數組
類似 varchar,設置 JSON 主要將字段的 type 是 json, 不能設置長度,可以是 NULL 但不能有默認值。

總結

分類 函數 描述
創建json
json_array 創建json數組
json_object 創建json對象
查詢json
json_contains 判斷是否包含某個json值
column->>path json_unquote(column -> path)的簡潔寫法
json_keys 提取json中的鍵值為json數組
json_search 按給定字符串關鍵字搜索json,返回匹配的路徑
修改json
json_array_append 末尾添加數組元素,如果原有值是數值或json對 象,則轉成數組后,再添加元素
json_array_insert 插入數組元素
json_insert 插入值(插入新值,但不替換已經存在的舊值)
json_merge 合並json數組或對象
json_remove 刪除json數據
json_replace 替換值(只替換已經存在的舊值)
json_set 設置值(替換舊值,並插入不存在的新值)
json_unquote 去除json字符串的引號,將值轉成string類型
返回json屬性
json_depth 返回json文檔的最大深度
json_length 返回json文檔的長度
json_type 返回json值得類型
json_valid 判斷是否為合法json文檔
參考

就是插入 json 格式的字符串,可以是對象的形式,也可以是數組的形式

INSERT INTO `a_goods` (`type`, `attrs`) 
VALUES ('["新品","熱銷",1,"0"]','{"name":"張三","age":20,"strage":"20","data":[1,"0"]}')

MySQL 也有專門的函數 JSON_OBJECTJSON_ARRAY 生成 json 格式的數據,但是吧,使用的時候有注意點,盡量之間寫進去吧

	//JSON_OBJECT必須是偶數,嵌套時必須搭配JSON_ARRAY
 INSERT INTO `a_goods` (`attrs`, `type`) 
 VALUES (
 JSON_OBJECT("name","張三","age",20,"strage","20","data",JSON_ARRAY("新品","熱銷",1,"0")), 
 JSON_ARRAY("新品","熱銷",1,"0")
 ) 

查詢

一般對應字符串類型的 category->’$.name’ 中還包含着雙引號,這其實並不是想要的結果,可以用 JSON_UNQUOTE 函數將雙引號去掉,從 MySQL 5.7.13 起也可以通過這個操作符 * ->> *這個和 JSON_UNQUOTE 是等價的

查詢json的值,即鍵的值

SELECT attrs->'$.name' as name, JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods
/* SELECT attrs->'$.name' as name, 查詢json數據中的name的值並賦值給name JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods */

json中的where 語句


SELECT * FROM a_goods WHERE type = CAST('["新品","熱銷",1,"0"]' as JSON)
//查詢json是否在數據庫的存在,其實就相當於 `where a=1` 只不過這個a得轉換一下
//CAST函數用於將某種數據類型的表達式顯式轉換為另一種數據類型


SELECT * FROM a_goods WHERE attrs->>'$.age' = '20' 
//要特別注意的是,JSON 中的元素搜索是嚴格區分變量類型的,比如說整型和字符串是嚴格區分的,即 “20”和20
SELECT * FROM a_goods WHERE JSON_CONTAINS(attrs, '20', '$.age')
SELECT * FROM a_goods WHERE JSON_CONTAINS(type, '"新品"')
//用JSON_CONTAINS 函數,但和 *column->path *的形式有點相反的是,JSON_CONTAINS 第二個參數是不接受整數的,無論 json 元素是整型還是字符串,否則會出現錯誤

更新

更新數組按以往的更新就行

	UPDATE a_goods SET type = '["demo","0",1]'

但如果要更新 JSON 下的元素,MySQL 並不支持 *column->path *的形式,則可能要用到以下幾個函數

JSON_INSERT() 插入新值,但不會覆蓋已經存在的值

 UPDATE a_goods SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;

JSON_SET() 插入新值,並覆蓋已經存在的值

UPDATE a_goods SET category = JSON_SET(category, '$.host', 'www.lnmp.cn', '$.url', 'http://www.lnmp.cn') WHERE id = 1;

JSON_REPLACE() 只替換存在的值

UPDATE a_goods SET category = JSON_REPLACE(category, '$.name', 'php', '$.url', 'http://www.php.net') WHERE i

JSON_REMOVE() 刪除 JSON 元素

UPDATE a_goods SET category = JSON_REMOVE(category, '$.url', '$.host') WHERE id = 1;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM