mysql 5.7 将 key/value 附加到嵌套的 json 对象

mysql 5.7 appending key/value to nested json object

我正在尝试 mysql 5.7 的新 API,它处理 JSON 列。我的 test 专栏如下所示:

{"foo":{"efg":1}, "bar":{"abc":0}}

我想做的是追加到其中一个键,例如 foo,这样它就会变成 "foo":{"efg":1, "klm":2}。到目前为止我在 their documentation:

之后尝试过的
mysql> select json_insert(test, '$.foo', 10, '$.foo.klm', 2) from table1
       where name='Joe';

所做的是替换 "efg":1,结果是 "foo":{"klm":2}

mysql> select json_array_append(test, '$.foo', '{"klm":2}') from table1 where
       name="Joe';

上面这行明显把foo转成了数组"foo":[{"efg":1}, {"klm":2}],这不是我想要的

我试过将查询组合在一起:

mysql> select json_insert(test, '$.foo', 10, '$.foo', 
       select json_merge(select json_extract(test, '$.foo') from table1 
       where name="Joe"), '{"klm":2}') from table1 where name="Joe";

这只是给我一个语法错误 near select json_extract(test, '$.foo')

如有任何建议,我们将不胜感激。

我无法重现问题。

测试:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.11    |
+-----------+
1 row in set (0.00 sec)

mysql> SET @`test` := '{"foo": {"efg":1}, "bar": {"abc":0}}';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT JSON_INSERT(@`test`,/*'$.foo', 10,*/ '$.foo.klm', 2);
+--------------------------------------------------+
| JSON_INSERT(@`test`, '$.foo.klm', 2)             |
+--------------------------------------------------+
| {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} |
+--------------------------------------------------+
1 row in set (0.00 sec)

更新

mysql> DROP TABLE IF EXISTS `table1`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `table1` (
    -> `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    -> `test` JSON
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `table1`
    ->     (`test`)
    -> VALUES
    ->     ('{"foo": {"efg":1}, "bar": {"abc":0}}');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT `id`, `test` FROM `table1`;
+----+----------------------------------------+
| id | test                                   |
+----+----------------------------------------+
|  1 | {"bar": {"abc": 0}, "foo": {"efg": 1}} |
+----+----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT JSON_INSERT(@`test`, '$.foo.klm', 2)
    -> FROM `table1`
    -> WHERE `id` = 1;
+--------------------------------------------------+
| JSON_INSERT(@`test`, '$.foo.klm', 2)             |
+--------------------------------------------------+
| {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} |
+--------------------------------------------------+
1 row in set (0.00 sec)

mysql> UPDATE `table1`
    -> SET `test` = JSON_INSERT(@`test`, '$.foo.klm', 2)
    -> WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT `id`, `test` FROM `table1`;
+----+--------------------------------------------------+
| id | test                                             |
+----+--------------------------------------------------+
|  1 | {"bar": {"abc": 0}, "foo": {"efg": 1, "klm": 2}} |
+----+--------------------------------------------------+
1 row in set (0.00 sec)