如何更新 mysql 5.7 中 json 列中的动态键数作为准备语句

How to update dynamic number of keys in json column in mysql 5.7 as prepared statement

我在 MySQL 5.7 中创建了一个 table,如下所示。

id   :int
data :json

现在数据有多个键 json。

data = {"a":"b","c":"d"};

现在我需要用新数据更新现有数据以更新其中的多个(动态)键。

如何实现。

这是一个演示。首先,我用 JSON 数据创建了一个像你一样的 table。

mysql [localhost] {msandbox} (test) > create table t (id int primary key, data json);
Query OK, 0 rows affected (0.02 sec)

mysql [localhost] {msandbox} (test) > insert into t values (1, json_object('a', 'b', 'c', 'd'));
Query OK, 1 row affected (0.01 sec)

mysql [localhost] {msandbox} (test) > select * from t;
+----+----------------------+
| id | data                 |
+----+----------------------+
|  1 | {"a": "b", "c": "d"} |
+----+----------------------+
1 row in set (0.00 sec)

现在我用新值更新 JSON 数据。

mysql [localhost] {msandbox} (test) > update t set data = json_merge_patch(data, json_object('a', 123, 'c', 'foo'));
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql [localhost] {msandbox} (test) > select * from t;
+----+------------------------+
| id | data                   |
+----+------------------------+
|  1 | {"a": 123, "c": "foo"} |
+----+------------------------+

对于准备好的语句,您应该在创建将更新数据的 JSON 对象时使用参数占位符。

update t set data = json_merge_patch(data, json_object(?, ?, ?, ?));

我不确定你所说的动态键是什么意思。您必须成对使用参数占位符(1 个键,1 个值),并且在准备查询时需要固定参数的数量。您可以编写应用程序代码来根据需要使用尽可能多的参数占位符构建查询。

您应该在此处阅读 JSON 函数,例如 JSON_MERGE_PATCH():https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html

您可以简单地 运行 通过以字符串形式设置更新的对象来进行更新查询。

例如: 考虑到您正在构建 JS 应用程序。

updatedData = JSON.Stringify(updatedData)

query> update t set data = updatedData;