如何解决如何在 MySQL 中对这个复杂的 json 数据类型字段执行添加、更新和删除?
我对 MySQL 中的 JSON 数据类型完全陌生。几天前我安装了 MySQL 5.7.34,现在我正在玩它。
所以,我在 MySQL 5.7.34
中有下表:
CREATE TABLE tb_products (
product_id int(11) NOT NULL AUTO_INCREMENT,product_name varchar(255) NOT NULL,product_attributes json NOT NULL,PRIMARY KEY (product_id)
);
该表中的一行如下所示:
product_attributes 字段:
[
{
"site": "site1","categories": [
"site1 cat1","site1 cat2","site1 cat3"
]
},{
"site": "site2","categories": [
"site2 cat1","site2 cat2"
]
}
]
我的第一个问题是,我是否以适当的格式将上述 JSON 数据放在上面以进行各种进一步的操作?
或者是否应该有一个键 attributes
以便于访问数据:
{
"attributes": [
{
"site": "site1","categories": [
"site1 cat1","site1 cat3"
]
},{
"site": "site2","categories": [
"site2 cat1","site2 cat2"
]
}
]
}
现在,我需要执行以下操作,但我不知道如何执行所有这些操作:
- 如何选择
site = site1
所在的行? - 如何选择
site = site1
和categories = site1 cat1
所在的行? - 如何将另一个对象
{"site": "site3","categories": [...]
添加到product_attributes
列? - 如何将另一个数组元素
site1 cat4
添加到site = site1
? - 如何删除属性
site = site1
? - 如何从类别
site1 cat1
wheresite = site1
中删除数组值?
解决方法
-
鉴于您所展示的内容,没有必要将此 JSON 变成具有
attributes
键的对象。我没有看到任何其他密钥在使用中,您也没有提到添加第二个密钥的任何期望。 -
如何选择
site = site1
所在的行?select product_id from tb_products where json_contains(product_attributes,'{"site":"site1"}');
-
如何选择
site = site1
和categories = site1 cat1
所在的行?select product_id from tb_products where json_contains(product_attributes,'{"site":"site1"}') and json_search(product_attributes,'one','site1 cat2') LIKE '%.categories[%';
-
如何将另一个对象
{"site": "site3","categories": [...]
添加到 product_attributes 列?update tb_products set product_attributes = json_array_append(product_attributes,'$',cast('{"site": "site3","categories":["..."]}' as json));
-
如何添加另一个数组元素
"site1 cat4"
wheresite = site1
?这是通过键和值来查找元素。在 JSON 中执行此操作的更好解决方案是 MySQL 8.0 中的
JSON_TABLE()
函数。在 MySQL 5.7 中没有很好的方法来做到这一点。您最终会执行仅按值搜索的
JSON_SEARCH()
,然后您必须对其返回的路径进行子字符串匹配。这对你来说开发难度大,代码维护难度大,无法优化。 -
如何删除属性
site = site1
?和以前一样。
-
如何从类别
site1 cat1
wheresite = site1
中删除数组值?和以前一样。
最终,如果您尝试在普通 SQL 表中使用 JSON 之类的行,那将是笨拙且低效的。渐渐地,MySQL 正在添加更多 JSON 函数来执行必要的操作,但它并不像在 SQL 中做同样的事情那么优雅。
另一个问题:在 WHERE 子句中搜索 JSON 数据不能使用索引。您最终会进行大量昂贵的表扫描。
还有一个问题:在 JSON 中存储数据所需的空间是在普通行和列中存储相同数据的 2 到 3 倍。随着您的数据库变得越来越大,您很快就会耗尽空间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。