[英]mysql JSON_SET can't insert into column with NULL value(5.7+)
[英]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 應該做的。
任何想法發生了什么?
更新json_test
SET data
= JSON_SET(IFNULL( data
,'{}' ), '$.a', 1)
`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.