JSON_SET不会更新MySQL中的null JSON字段

时间:2016-12-20 05:35:29

标签: mysql json

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

示例查询:

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

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

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

任何想法发生了什么?

3 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:1)

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

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

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

`dataJson TEXT DEFAULT '{}',`

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

答案 2 :(得分:0)

为此更新整个表是一个过大的选择,并且还更改了表定义。
这应该不会对性能产生明显影响:

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

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