MySQL中如何为JSON格式数据追加年份键值对?
解决MySQL中JSON对象追加年份数据的问题
哦,我懂你遇到的麻烦了——你想用JSON_ARRAY_APPEND给现有的JSON对象追加2018年的数据,但结果肯定不是你想要的结构,对吧?问题出在函数用错了:JSON_ARRAY_APPEND是专门给JSON数组追加元素的,而你的payment字段存的是一个JSON对象(键值对形式,比如{"2017": {...}}),用它的话会把新的年份对象当成数组元素塞进去,最后变成数组套对象的奇怪结构,完全不符合需求。
那该用什么函数呢?给你两个靠谱的方案:
方案1:用JSON_INSERT(安全新增,不覆盖已有键)
这个函数只会插入不存在的键,如果payment里已经有"2018"这个年份,它不会做任何修改,很适合你这种追加新年份的场景:
UPDATE calculation SET payment = JSON_INSERT( payment, '$.2018', CAST('{"1": {"payed": 0, "charge": 0}}' AS JSON) );
这里的'$.2018'是JSON路径,指定要在根对象下添加"2018"这个键,后面的CAST是把字符串转成JSON类型(MySQL 5.7+支持,也可以直接写JSON字面量,但CAST更稳妥)。
方案2:用JSON_MERGE_PRESERVE(合并两个JSON对象)
如果你要一次性合并多个年份数据,这个函数更方便,它会把原对象和新对象的键值对合并到一起:
UPDATE calculation SET payment = JSON_MERGE_PRESERVE( payment, CAST('{"2018": {"1": {"payed": 0, "charge": 0}}}' AS JSON) );
比如以后你要加2019、2020年的数据,直接把多个年份的JSON字符串合并进去就行。
额外提醒
如果你不确定某个年份是否存在,而且需要覆盖它的话,可以用JSON_SET——它会修改已存在的键,不存在的话就新增,用法和JSON_INSERT完全一样,只是行为不同。
内容的提问来源于stack exchange,提问作者Igor Petev
相关产品推荐
相关产品推荐

