【发布时间】:2021-08-29 17:00:15
【问题描述】:
考虑这张表:
DROP TABLE IF EXISTS `example`;
CREATE TABLE `example` (
`id` int NOT NULL AUTO_INCREMENT,
`content` json NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
还有这些行:
INSERT INTO example(content)
VALUES (
'[ { "date": "1617210148", "name": "John", "status": "0" },
{ "date": "1617210148", "name": "Jack", "status": "0" },
{ "date": "1617210148", "name": "Henry", "status": "0" }]'
);
我想更新键 status 的值,其中 name = Jack 为 1
结果将是:
{ "date": "1617210148", "name": "Jack", "status": "1" }
如何在 SQL 查询中使用 JSON_REPLACE() 或 JSON_SET() 执行此操作(我的目标是进行部分更新,因为我使用的是 MySQL 8.0.25)?
【问题讨论】:
-
出于好奇,您为什么选择对这些数据使用 JSON?它是一个相似文档的数组(每个文档中的相同字段),它可以作为第二个表,其中包含一组行而不是数组,以及普通列而不是对象字段。然后在单行上更新名称会很容易。
-
我计划解析数组以填充由 datatables.net javascript 管理的表中的 html 行,以管理客户端过滤和分页。我更喜欢选择一个大字段,而不是让我的用户在数十万行中选择数百行。对数据的唯一操作是通过 Ajax 更新此键值。除此之外,我不需要查询这些数据。
-
您可以创建一个端点,将收集的数据作为 JSON 文档返回,即使这些行以规范化的方式存储在数据库中也是如此。例如,我使用 JSON_ARRAYAGG() 和 JSON_OBJECT() 完成了这项工作。这使得客户端很容易使用它,但在数据库中保持一种更有效的格式。
-
最终我并不真正关心 json 格式的数据,如果我不清楚,对不起。我的意思是我更喜欢将所有数据存储在一个字段中,无论是 JSON,而不是在一个表中进行 SELECT 查询,如果我必须对数据进行规范化,那么表中会有数十万行。由于我上面提到的密钥的频繁更新,缓存也不是一个真正的选择。在速度和查询成本方面,我认为使用单个 json 字段会更好......也就是说,如果我能找到一种方法来更新嵌套键的值。
标签: mysql sql-update mysql-json