【问题标题】:JSON_SET isn't updating null JSON field in MySQLJSON_SET 不更新 MySQL 中的空 JSON 字段
【发布时间】:2017-05-05 06:27:16
【问题描述】:

我有一个可为空的 JSON MySQL 5.7 字段,我发现它几乎无法正常工作。

查询示例:

UPDATE `json_test` SET `data` = JSON_SET(`data`, '$.a', 1)

如果字段数据已经为NULL,则不会更新。

如果是{ "a" : 2 },那么它将正确更新为 1。如果尚未设置,我需要设置它,这是 JSON_SET 应该做的。

有什么想法吗?

【问题讨论】:

    标签: mysql json


    【解决方案1】:

    为此更新整个表有点过头了,而且还要更改表定义。
    这应该不会对性能产生明显影响:

    UPDATE `json_test` SET `data` = JSON_SET(COALESCE(`data`,'{}'), '$.a', 1)
    

    说明:
    JSON_SET 在任何情况下都需要对列进行完整处理,因此将对其进行有效性评估、解析等。
    COALESCE 将 NULL 字段更改为空 JSON 对象,因此 json 将有效并且 SET 将成功。
    您可能无法衡量性能差异。

    【讨论】:

      【解决方案2】:

      1) 另一种方法是检查 null 并在这些情况下将有效的空 JSON 集 ({}) 返回到 JSON_SET,因此它只是放入新数据。

      UPDATE json_test SET data = JSON_SET(IFNULL(data,'{}' ), '$.a', 1)

      2) 最后,另一种选择是让数据规范具有默认值 {},例如。

      `dataJson TEXT DEFAULT '{}',`
      

      我更喜欢我提出的第一个选项,因为我喜欢将字段保留为 NULL,直到我需要它们拥有数据,但我希望它们立即开始打包 JSON 数据!

      【讨论】:

      • 这太棒了。它的技巧很简单,但非常有用。现在有了这个,我们可以简单地使用 JSON_SET 更新现有的或插入一个新的。
      【解决方案3】:

      not supposed to 使用空值

      否则,文档中不存在路径的路径/值对是 被忽略并且没有效果。

      现在 mysql 不允许您在要更新的同一个表上使用子查询,但是您可能仍然可以使用 CASE/WHEN 使用 UPDATE JOIN 来解决这个问题,但是我太懒了,所以我给您提供了两个查询解决方案.

      UPDATE `json_test` SET `data` = JSON_SET(`data`, '$.a', 1) WHERE data IS NOT NULL;
      
      UPDATE `json_test` SET `data` = JSON_OBJECT('$.a', 1) WHERE data IS NULL;
      

      【讨论】:

      • 太好了。您唯一的错误是 JSON_OBJECT 您只需设置“a”,1,您在设置密钥时无法使用 $.a 访问。
      猜你喜欢
      • 2019-10-06
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2023-01-19
      • 2021-06-21
      相关资源
      最近更新 更多