You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:42:39