Вот демо. Сначала я создаю таблицу, подобную вашей, с данными JSON.
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