MySQL JSON类型字段的查找与更新
Posted 忧郁的叮当猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL JSON类型字段的查找与更新相关的知识,希望对你有一定的参考价值。
mysql 提供了丰富的函数用于 JSON 类型字段的查找与更新,详见官方文档。
创建一个表 t1,basic_info 字段为JSON类型:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`basic_info` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
插入一条数据:
INSERT INTO `t1`(`id`, `basic_info`) VALUES (1, '\\"age\\": 9, \\"name\\": \\"小明\\", \\"class\\": 3');
一、检索 JSON:
1、查找 JSON 中的某个字段:
比如查询 id=1 的 basic_info 中的 name 字段,可以用以下两种方式:
select basic_info->'$.name' from t1 where id =1;
//或者
select JSON_EXTRACT(basic_info, '$.name') from t1 where id =1;
2、根据JSON中的某个字段查询表中记录:
比如查询name为小明的记录:
select * from t1 where basic_info->'$.name' = '小明';
//或者
select * from t1 where JSON_EXTRACT(basic_info,'$.name') = '小明';
检索JSON数据的方法,文档:https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html
二、修改 JSON
修改JSON中字段的方法,文档:MySQL :: MySQL 8.0 Reference Manual :: 12.18.4 Functions That Modify JSON Values
1、修改 JSON 中的某个字段:
比如我们修改 id =1 的 basic_info 中的age为 10 岁:
可以使用JSON_REPLACE() 或者 JSON_SET() 函数:
update t1 set basic_info = JSON_REPLACE(basic_info, '$.age', 10) where id =1;
//或者
update t1 set basic_info = JSON_SET(basic_info, '$.age', 10) where id =1;
2、往 JSON 中插入一个新的字段:
比如往 basic_info 中插入一个性别“gender”字段:
可以使用JSON_INSERT() 或者 JSON_SET() 函数:
update t1 set basic_info = JSON_INSERT(basic_info, '$.gender', '男') where id =1;
//或者
update t1 set basic_info = JSON_SET(basic_info, '$.gender', '男') where id =1;
SON_SET(),JSON_INSERT() 和JSON_REPLACE() 函数的区别:
-
JSON_SET() 支持替换现有值,并且支持添加不存在的值。
-
JSON_INSERT() 插入值而不替换现有值。
-
JSON_REPLACE() 仅替换现有值。
MySQL JSON类型
参考技术A MySQL支持JSON数据类型。相比于Json格式的字符串类型,JSON数据类型的优势有:存储在JSON列中的任何JSON文档的大小都受系统变量 max_allowed_packet 的值的限制,可以使用 JSON_STORAGE_SIZE() 函数获得存储JSON文档所需的空间。
在MySQL8.0中,优化器可以执行JSON列的局部就地更新,而不用删除旧文档再将整个新文档写入该列。局部更新的条件:
JSON数组包含在 字符 [ 和 ] 字符中,其中为一个由逗号分隔的值列表:
JSON对象包含在字符 和 字符中,其中为一组由逗号分隔的键值对,键必须是字符串:
在JSON数组和JSON对象的值中允许嵌套:
下例中向创建一个只有一个JSON列的表格 t_json ,并向其中添加JSON值:
若添加的值为非JSON格式,则报错:
查看 t_json :
如果传入的参数不能组成键值对,则报错:
因此我们也可以使用以上三种方法向表中添加JSON值,可以一定程度地避免输入格式错误:
解析字符串并发现字符串是有效的JSON文档时,它在被解析时也会被规范化。对于重复的键( key ),后面的值( value )会覆盖前面的值。如下:
这种“覆盖”在向JSON列添加值时也会发生。
在MySQL8.0.3之前的版本中,与此相反,对于被重复的键,它的第一个值会被保留,后添加的值则会被抛弃。
MySQL8.0.3及更高版本中,有两种合并函数: JSON_MERGE_PRESERVE() 和 JSON_MERGE_PATCH() 。下面具讨论它们的区别。
合并数组时, JSON_MERGE_PRESERVE 只保留最后传入的数组参数,而 JSON_MERGE_PRESERVE 则按传入顺序将数组参数连接。
合并对象时,对于重复键, JSON_MERGE_PRESERVE 只保留最后传入的键值,而 JSON_MERGE_PRESERVE 重复键的所有值保留为数组。
在了解搜索和修改JSON值之前,先来看看JSON的路径语法。
JSON_EXTRACT 提取JSON值,直接看例子:
JSON_REPLACE 与 JSON_SET 的区别:
JSON_INSERT 和 JSON_SET :
JSON_REMOVE :
可以使用 = , < , <= , > , >= , <> , != ,和 <=> 对JSON值进行比较。
JSON值的比较先比较值的类型。如果类型不同,则直接 返回类型的优先级的比较结果;如果类型相同,再进行值的内容的比较。
OPAQUE 值是不属于其他类型的值。
转换规则为:
以上是关于MySQL JSON类型字段的查找与更新的主要内容,如果未能解决你的问题,请参考以下文章