怎么对json格式的数据进行修改?

建表语句如下,为 area 字段 声明为 JSON 类型;

1
2
3
4
5
6
7
8
9
CREATE TABLE `order` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`order_name` varchar(255) DEFAULT NULL COMMENT '订单名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`year` year(4) DEFAULT NULL COMMENT '年份',
`area` json DEFAULT NULL COMMENT '地区',
PRIMARY KEY (`id`),
UNIQUE KEY `order_name` (`order_name`,`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

MySQL 中支持 json 对象 和json 数组,他们之间可以相互嵌套;json类似map,在java中json就是map得实现类,初学者若不懂何为json,就当作map来用,即储存 key - value 形式得数据结构;注意点是 json 数据 得key 必须是字符串,可以有key无value

2.1 插入 josn数据

插入 json 对象,east 得值 为 50 , sourth 值为65 得 json对象;

1
2
INSERT INTO `order`(`order_name`, `year`, `area`) 
VALUES ('荷小花的订单', 2020, '{"east": "50", "south": "65"}');

等效于使用 JSON_OBJECT 函数, 示例如下

1
2
INSERT INTO `order`(`order_name`, `year`, `area`) 
VALUES ('荷小花的订单', 2020, JSON_OBJECT("east", "50", "south", "65"));

插入 json 数组

1
2
INSERT INTO `order`(`order_name`, `year`, `area`) 
VALUES ('荷小花的订单', 2020, '[{"east": "50", "south": "65"}]');

等效于使用 JSON_ARRAY 函数,示例如下

1
2
INSERT INTO `order`(`order_name`, `year`, `area`) 
VALUES ('荷小花的订单', 2020, JSON_ARRAY("east", "50", "south", "65"));

2.2 查询json数据

使用 column - path 路径符 -> 查询 指定key 得值,

1
select order_name, area -> '$.east' from `order`

注意,如果json 数据中不存在 east 得键,则列出为null值

输出如下

1
2
3
---------   ------
荷小花的订单 "50"
荷小花的订单

也可以使用 ->> 符号, 不同之处是使用 ->> 更加直观,输出得json数据最外层不会携带双引号,内层数据中存在双引号不会有反斜杠转义;

1
select order_name, area ->> '$.east' from `order`

使用 单引号 代替 双引号

1
select order_name, area ->> "$.east" from `order`

我们 也可以使用 JSON_EXTRACT 函数 达到同样得效果;

1
SELECT order_name,JSON_EXTRACT(area, '$.east') from `order`;

2.3 修改json数据

使用 JSON_SET 设置 json key 得 值

id = 1 得 area 数据如下

1
{"north": "55", "south": "66"}

现在将south 值改为 60 的语句示例如下

1
update `order` set area = json_set(area, '$[0].south', '60') where id = '1'

其中 $[0] 代表 json 中的第一个对象 ,以此类推 $[1] 为 josn 中的第二个对象;

示例

1
["6","2",{"east": "50", "south": "65"}]

$[0] 为”6”,$[1] 为 “2” , $[2] 为 {“east”: “50”, “south”: “65”}; $[2].east 为 “50” , 或者 $[2][1];

如果上面$[*] 表达式式理解困难也可以使用如下方式

1
update `order` set area = json_set(area, '$.south', '60') where id = '1'

tip: 如果更改整个json值 与 平时的更新数据方式一致

2.4 删除json中的数据

使用 json_remove 可以达到效果;

示例: 删除json 中的 south 键

1
update `order` set area =json_remove(area, '$.south') where id = '1'

三 json函数

3.5 JSON_INSERT

JSON_INSERT 函数 向 json 中添加新的值,不会改变已经存在的值;

id = 1 的数据如下

1
{"north": "55"}

更新语句如下

1
update `order` set area =JSON_INSERT(area, '$.north', 55 ,'$.south', "60") where id = '1'

更改结果如下

1
{"north": "55", "south": "60"}

3.8 JSON_KEYS

返回json顶级值底下所有key

id = 1 的数据如下

1
[{"north": "50", "south": "60"}, {"north": "50", "south": "70"}]

查询json数据中第一个json对象所有的key

1
select JSON_KEYS(area, '$[0]')  from `order`  where id = '1'

输出

1
["north", "south"]