微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

修改 JSON 对象数组中的属性

如何解决修改 JSON 对象数组中的属性

假设我在表 comments 中有一个 JSON 列 posts,我在其中存储了具有 2 个属性的对象数组:at 具有创建日期时间和 {{1} } 作为评论内容

我想用静态字符串 'Lorem ipsum ...' 替换每条评论内容

我尝试了很多查询,例如

content

...没有成功。在单个查询中使用 MysqL 5.7 是可能的吗?这是一个 DBfiddle https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=bc9c37083546350fa2de6fe00b463eda

解决方法

让我们试试:

mysql> update posts set comments = json_set(comments,'$[*].content','Lorem ipsum');
ERROR 3149 (42000): In this situation,path expressions may not contain the * and ** tokens.

不,错误信息很明确。此处不能使用通配符。您必须使用标识单个元素的 JSON 路径。

如果你想设置多个元素,JSON_SET() 允许多个参数。

update posts set comments = json_set(comments,'$[0].content','Lorem ipsum','$[1].content','$[2].content','$[3].content','$[4].content','$[5].content','$[6].content','Lorem ipsum');

有没有办法在一个路径表达式中做到这一点,或者自动将参数填充到数组中的最大元素数?号

事实是,您使用 SQL 不当。如果您不使用 JSON,而是以规范化的方式存储评论,则可以轻松完成此操作,在第二个表中每行一个评论,引用帖子。

CREATE TABLE comments (
  comment_id INT AUTO_INCREMENT PRIMARY KEY,post_id INT NOT NULL,content TEXT NOT NULL
);

INSERT INTO `comments` (`post_id`,`content`) VALUES
(1,'content'),(1,(2,'content');

现在可以轻松使用 SQL 对所有评论进行您描述的更新:

UPDATE comments SET content = 'Lorem ipsum';

JSON 似乎是 MySQL 5.7 和 8.0 的一个有吸引力的特性,但实际上它使大多数查询变得更加困难。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。