3

假设我有一个带有 JSON 数据的文本字段,如下所示:

{
    "id": {
        "name": "value",
        "votes": 0
    }
}

有没有办法编写一个可以找到id然后增加votes值的查询?

我知道我可以只检索我需要的 JSON 数据更新并重新插入更新版本,但我想知道有没有办法在不运行两个查询的情况下做到这一点?

4

2 回答 2

3
UPDATE `sometable`
    SET `somefield` = JSON_REPLACE(`somefield`, '$.id.votes', JSON_EXTRACT(`somefield` , '$.id.votes')+1)
    WHERE ...

编辑

从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 数据类型,可以有效访问 JSON 文档中的数据。

JSON_EXTRACT将允许您访问 JSON 字段中的特定 JSON 元素,而JSON_REPLACE将允许您更新它。

要指定您希望访问的 JSON 元素,请使用格式为的字符串

'$.[top element].[sub element].[...]'

因此,在您的情况下,要访问id.votes,请使用字符串'$.id.votes'

上面的 SQL 代码演示了将所有这些放在一起以将 JSON 字段的值增加 1。

于 2017-03-08T16:24:13.033 回答
0

我认为对于这样的任务,您会被困在一个普通的 oldSELECT后跟一个UPDATE(在您解析 JSON 之后,增加您想要的值,然后将 JSON 序列化回来)。

您应该将这些操作包装在一个事务中,如果您使用的是 InnoDB,那么您也可以考虑使用SELECT ... FOR UPDATEhttp ://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

这有点切题,但我想我还要提到这是像 MongoDB 这样的 NoSQL 数据库非常擅长的操作类型。

于 2013-08-15T15:16:03.967 回答