【问题标题】:How to update JSON data type column in MySQL 5.7.10?如何更新 MySQL 5.7.10 中的 JSON 数据类型列?
【发布时间】:2016-05-01 09:15:45
【问题描述】:

我最近开始使用 MySQL 5.7.10,我非常喜欢原生 JSON 数据类型。

但是在更新 JSON 类型值时遇到了问题。

问题:

下面是表格格式,这里我想在 t1 表格的 JSON data 列中再添加 1 个键。现在我必须获取值修改它并更新表。所以它涉及到一个额外的SELECT 声明。

我可以这样插入

INSERT INTO t1 values ('{"key2":"value2"}', 1);

mysql> select * from t1;
+--------------------+------+
| data               | id   |
+--------------------+------+
| {"key1": "value1"} |    1 |
| {"key2": "value2"} |    2 |
| {"key2": "value2"} |    1 |
+--------------------+------+
3 rows in set (0.00 sec)

mysql>Show create table t1;


+-------+-------------------------------------------------------------

-------------------------------------------------------+
| Table | Create Table                                                                                                       |
+-------+--------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `data` json DEFAULT NULL,
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

有解决办法吗?

【问题讨论】:

  • 为什么要添加这样的数据?它应该是键和值的单独列。
  • @PathikVejani 就像我提到的,我正在尝试使用提供本机 json 数据类型的 mysql 5.7。我的 JSON 可能很大。我无法为每个键值对添加列。
  • @wchiquito 感谢您为我指明正确的方向。我已经发布了我的解决方案,但所有功劳都应该归你所有。
  • 这个链接很有用的好消息。

标签: mysql json mysql-5.7 mysql-json


【解决方案1】:

感谢@wchiquito 为我指明了正确的方向。我解决了这个问题。这是我的做法。

mysql> select * from t1;
+----------------------------------------+------+
| data                                   | id   |
+----------------------------------------+------+
| {"key1": "value1", "key2": "VALUE2"}   |    1 |
| {"key2": "VALUE2"}                     |    2 |
| {"key2": "VALUE2"}                     |    1 |
| {"a": "x", "b": "y", "key2": "VALUE2"} |    1 |
+----------------------------------------+------+
4 rows in set (0.00 sec)

mysql> update t1 set data = JSON_SET(data, "$.key2", "I am ID2") where id = 2;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+----------------------------------------+------+
| data                                   | id   |
+----------------------------------------+------+
| {"key1": "value1", "key2": "VALUE2"}   |    1 |
| {"key2": "I am ID2"}                   |    2 |
| {"key2": "VALUE2"}                     |    1 |
| {"a": "x", "b": "y", "key2": "VALUE2"} |    1 |
+----------------------------------------+------+
4 rows in set (0.00 sec)

mysql> update t1 set data = JSON_SET(data, "$.key3", "I am ID3") where id = 2;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from t1;
+------------------------------------------+------+
| data                                     | id   |
+------------------------------------------+------+
| {"key1": "value1", "key2": "VALUE2"}     |    1 |
| {"key2": "I am ID2", "key3": "I am ID3"} |    2 |
| {"key2": "VALUE2"}                       |    1 |
| {"a": "x", "b": "y", "key2": "VALUE2"}   |    1 |
+------------------------------------------+------+
4 rows in set (0.00 sec)

编辑: 如果要添加数组,请使用JSON_ARRAY like

update t1 set data = JSON_SET(data, "$.key4", JSON_ARRAY('Hello','World!')) where id = 2;

【讨论】:

  • 此更新适用于单个 "key: value" 。那么如何更新多个键值呢?......
  • @siva like this - JSON_SET(@j, '$.key1', 10, '$.key2', '[true, false]')
  • 如果我想要来自"$.(:passedData)" 的密钥怎么办?我想根据从客户端获得的值更新密钥,似乎我无法通过任何值传递:passedData
【解决方案2】:

现在使用 MySQL 5.7.22+,在单个查询中更新整个 json 片段(多个键值,甚至嵌套)非常简单直接:

update t1 set data = 
JSON_MERGE_PATCH(`data`, '{"key2": "I am ID2", "key3": "I am ID3"}') where id = 2;

希望它可以帮助访问此页面并寻找“更好”的人JSON_SET :) 更多关于JSON_MERGE_PATCH的信息在这里: https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-merge-patch

【讨论】:

  • 另外值得一提的是,如果当前data 为空,则此更新不起作用(据我记得在 MySQL 8.0.13 之前,您无法将默认值设置为 JSON 列)。所以你可能想做类似update t1 set data = JSON_MERGE_PATCH(COALESCE(`data`, "{}"), '{"key2": "I am ID2", "key3": "I am ID3"}') where id = 2;
猜你喜欢
  • 2021-06-16
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2016-10-15
  • 2019-09-01
相关资源
最近更新 更多