文章目錄
1. 結構
1.1 表結構
CREATE TABLE test
(
id int(10)NOT NULL AUTO_INCREMENT,
content JSON default null,
arrs JSON default null,
PRIMARY KEY (id)
);
1.2 content 結構
type content struct {
name string
age int
}
1.3 arrs 結構
var arrs []int
2. 插入
2.1 字符串插入
INSERT INTO test('id','content', 'arrs') VALUES (1,'{"name": "pibigstar","age": 20}', '[1,2,3]' )
2.2 JSON函數插入
INSERT INTO test('id','content', 'arrs') VALUES (1, JSON_OBJECT("name","pibigstar","age",20), JSON_ARRAY(1,2,3))
3. 查詢
查詢JSON中的數據用 column->path的形式,其中對象類型path的表示方式 .path
3.1 查詢內容
SELECT id,content->'$.name' AS name, content->'$.age' AS age, arrs->'$[0]' AS arr1,arrs->'$[1]' AS arr2 FROM test;
當JSON裏面的字段爲string時,使用上面的方式查出來內容的帶 “”
,可使用 ->> 方式去掉 “”
SELECT id,content->>'$.name' AS name FROM test;
3.2 搜索條件
3.2.1 全匹配
SELECT * FROM test WHERE content = CAST('{"name": "pibigstar","age": 20}' AS JSON);
3.2.2 JSON某字段匹配
SELECT * FROM test WHERE content->'$.name' = 'pibigstar';
忽略類型
使用
->>
的方式會忽略其類型
# 查不到
SELECT * FROM test WHERE category->'$.age' = '20'
# 能查到
SELECT * FROM test WHERE category->>'$.age' = '20'
3.2.2 使用JSON函數
SELECT * FROM test WHERE JSON_CONTAINS(content,'20','$.age');
4. 更新
4.1 全量更新
UPDATE test
SET content = JSON_OBJECT("name","haimian","age",22)
WHERE id = 1;
4.2 插入新值(不覆蓋已存在值)
UPDATE test
SET content = JSON_INSERT(content, '$.name', 'haimian', '$.sex', '男')
WHERE id = 1;
執行完之後,name值還是 pibigstar,但會新增加一個 sex字段
4.3 插入新值,並覆蓋已存在的值
UPDATE test
SET content = JSON_SET(content, '$.name', 'haimian', '$.age', 22, '$.sex', '男')
WHERE id = 1
執行完之後,name會改變,但會新增加一個 sex字段
4.4 替換某字段值
UPDATE test
SET content = JSON_REPLACE(content, '$.name', 'haimian')
WHERE id = 1
將name從原先的 pibigstar 改爲 haimian,它只會替換已存在的字段的值
4.5 刪除某字段的值
UPDATE test
SET content = JSON_REMOVE(content, '$.name', '$.age')
WHERE id = 1
刪除 name 和 age 字段