JSON_SET 不更新 MySQL 中的空 JSON 字段

Jon*_*han 2 mysql json

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

示例查询:

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

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

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

任何想法发生了什么?

小智 9

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

更新json_testSET data= JSON_SET(IFNULL( data,'{}' ), '$.a', 1)

2) 最后,另一个选项是数据规范具有 {} 的默认值,例如。

`dataJson TEXT DEFAULT '{}',`
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*ohn 7

为此更新整个表是一种过度杀伤力,并且还更改表定义。
这应该不会对性能产生明显的影响:

UPDATE `json_test` SET `data` = JSON_SET(COALESCE(`data`,'{}'), '$.a', 1)
Run Code Online (Sandbox Code Playgroud)

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


e4c*_*4c5 5

不应该与空值一起使用

否则,文档中不存在的路径的路径/值对将被忽略并且不起作用。

现在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;
Run Code Online (Sandbox Code Playgroud)

  • 那太棒了。您遇到的唯一错误是 JSON_OBJECT 您只需设置 'a', 1,在设置密钥时不能使用 $.a 进行访问。 (2认同)