【发布时间】: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 应该做的。
有什么想法吗?
【问题讨论】:
我有一个可为空的 JSON MySQL 5.7 字段,我发现它几乎无法正常工作。
查询示例:
UPDATE `json_test` SET `data` = JSON_SET(`data`, '$.a', 1)
如果字段数据已经为NULL,则不会更新。
如果是{ "a" : 2 },那么它将正确更新为 1。如果尚未设置,我需要设置它,这是 JSON_SET 应该做的。
有什么想法吗?
【问题讨论】:
为此更新整个表有点过头了,而且还要更改表定义。
这应该不会对性能产生明显影响:
UPDATE `json_test` SET `data` = JSON_SET(COALESCE(`data`,'{}'), '$.a', 1)
说明:
JSON_SET 在任何情况下都需要对列进行完整处理,因此将对其进行有效性评估、解析等。
COALESCE 将 NULL 字段更改为空 JSON 对象,因此 json 将有效并且 SET 将成功。
您可能无法衡量性能差异。
【讨论】:
UPDATE json_test SET data = JSON_SET(IFNULL(data,'{}' ), '$.a', 1)
`dataJson TEXT DEFAULT '{}',`
我更喜欢我提出的第一个选项,因为我喜欢将字段保留为 NULL,直到我需要它们拥有数据,但我希望它们立即开始打包 JSON 数据!
【讨论】:
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;
【讨论】: