簡體   English   中英

JSON_SET 不更新 MySQL 中的空 JSON 字段

[英]JSON_SET isn't updating null JSON field in MySQL

我有一個可為空的 JSON MySQL 5.7 字段,我發現它幾乎無法工作。

示例查詢:

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

如果字段數據已經為 NULL,則不會更新。

如果它是{ "a" : 2 } ,那么它將正確更新為 1。如果尚未設置,我需要設置它,這就是 JSON_SET 應該做的。

任何想法發生了什么?

1) 在這些情況下,另一種方法是檢查 null 並將有效的空 JSON 集 ({}) 返回給 JSON_SET,因此它只會放入新數據。

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

2) 最后,另一個選項是數據規范具有 {} 的默認值,例如。

`dataJson TEXT DEFAULT '{}',`

我更喜歡我提出的第一個選項,因為我喜歡將字段保留為 NULL,直到我需要它們擁有數據,但隨后我希望它們立即開始打包 JSON 數據!

為此更新整個表是一種矯枉過正,並且還要更改表定義。
這應該沒有明顯的性能影響:

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

解釋:
JSON_SET 在任何情況下都需要對列進行完整處理,因此將對其有效性進行評估、解析等。
COALESCE 將 NULL 字段更改為空的 JSON 對象,因此 json 將有效並且 SET 將成功。
您可能無法衡量性能差異。

不應該與空值一起使用

否則,文檔中不存在路徑的路徑/值對將被忽略且無效。

現在 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM