更新mysql中某个json字段的键值

Posted

技术标签:

【中文标题】更新mysql中某个json字段的键值【英文标题】:Update the key value of a json field in mysql 【发布时间】:2021-12-20 12:44:54 【问题描述】:

我有以下 json 字段


  "Covid-19Vaccine Staus": "Not vaccinated (intent to in the future)",
  "Date of last vaccine taken": "2021-08-09T00:00:00+04:00",
  "If vaccinated, Name of vaccination received": "Other WHO Approved vaccine"

我想做的是将关键描述(即 Covid-19 Vaccine Staus)更新为 Covid19VaccineStaus。

在对 mysql 工作台上的字段进行直接更新时,它会生成以下查询,

UPDATE `my_json_table` SET `containerValue` = '\"Covid19VaccineStaus\": \"Vaccinated\", \"Date of last vaccine taken\": \"2021-07-13T00:00:00+04:00\", \"If vaccinated, Name of vaccination received\": \"Pfizer-BioNTech\"' WHERE (`id` = '94');

看起来它需要字段的整个值,然后进行更新。

如果我只想更新 Covid19VaccineStatus 键而不输入 json 架构的其他数据点的值,查询应该是什么样子。

【问题讨论】:

【参考方案1】:

请看JSON functions

JSON_REPLACE,

替换 JSON 文档中的值

JSON_REMOVE,

从 JSON 文档中删除数据

JSON_INSERT

将数据插入 JSON 文档

UPDATE `my_json_table` SET `containerValue` = JSON_REPLACE(`containerValue`, '$."Covid-19Vaccine Staus"', 'Vaccinated') WHERE (`id` = '94');

UPDATE `my_json_table` SET `containerValue` = JSON_REMOVE(`containerValue`, '$."Covid-19Vaccine Staus"') WHERE (`id` = '94');

UPDATE `my_json_table` SET `containerValue` = JSON_INSERT(`containerValue`, '$."Covid-19Vaccine Staus"', 'Vaccinated') WHERE (`id` = '94');

替换键并保留值

UPDATE `my_json_table` 
SET `containerValue` = 
    JSON_REMOVE(
        JSON_INSERT(`containerValue`, '$."Covid19VaccineStaus"', 
            JSON_EXTRACT(`containerValue`, '$."Covid-19Vaccine Staus"')), 
        '$."Covid-19Vaccine Staus"') 
WHERE (`id` = '94');

【讨论】:

谢谢。所以在我的情况下,我将不得不使用 JSON_REPLACE。但我看到这个值也是必需的?我有多个记录,我只需要更改密钥。 @Bisoux JSON_REPLACE 是替换值,您的意思是更改键并且相应的值保持原样吗? 没错,是的,这就是我希望做的。现在我不得不去手动更新字段上的键值一个一个 让我更新答案以添加此用例【参考方案2】:

您可以使用处理插入和更新操作的JSON_SET。

UPDATE my_json_table
SET containerValue = JSON_SET(containerValue, '$."Covid-19Vaccine Staus"', 'Vaccinated')
WHERE id = 94;

因此,如果您的密钥在您的 JSON 中尚不存在,它将使用值 Vaccinated 插入。否则,您的键对应的值将被更新。

您还可以找到示例 here,了解如何使用 JSON_SET 处理数组或多个值。

如果您只需要更新值而不在您的 JSON 中执行任何插入(如果键不存在),则可以使用 JSON_REPLACE。

如果您只需要插入键和值,但如果键已经存在而不在 JSON 中执行任何更新,则可以使用JSON_INSERT。

如果您想更新密钥的名称:

UPDATE my_json_table
SET containerValue = JSON_INSERT(
   JSON_REMOVE(containerValue, '$."Covid-19Vaccine Staus"'),
   '$.Covid19VaccineStaus',
   JSON_EXTRACT(containerValue, '$."Covid-19Vaccine Staus"')
)
WHERE id = 94;

【讨论】:

以上是关于更新mysql中某个json字段的键值的主要内容,如果未能解决你的问题,请参考以下文章

如何从mongodb的表中读取各字段对应的类型

如何使 JavaScript 中每个元素的 map 函数的键值递增

PostgreSQL9.4往jsonb字段新增键值SQL怎么写

mysql中,通过json_insert函数向json字段插入键值?json_insert函数的使用?

在 BigQuery 中查询重复的键值字段

mongodb如何删除集合中的指定键值对???