UPDATE表名
SET字段名 = CASE WHENJSON_EXTRACT(字段名,'$.字段里的对象名.对象内部字段名') IS NOT NULLTHENJSON_SET (字段名,"$.字段里的对象.对象内部字段",更新后的值)ELSEJSON_INSERT (字段名,"$.字段里的对象名",JSON_OBJECT("对象内部字段名",更新后的值))END;
WHERE具体条件
以上SQL用于更新JSON结构数据内部的对象,不存在则插入,非对象的键值、对象多层嵌套同理,业务复杂时建议使用java代码转换为JSONObject处理。
例如存在 bill 账单表,定义了 text 类型的字段 bill_extension 以存储JSON数据,有一条数据为 {"customerCode": "a", "commodity": {"price": 10,"num":1}} ,把 commodity 对象里的 price 改为20。
UPDATEbill
SETbill_extension = CASE WHENJSON_EXTRACT(bill_extension,'$.commodity.price') IS NOT NULLTHENJSON_SET (bill_extension,"$.commodity.price",20)ELSEJSON_INSERT (bill_extension,"$.commodity",JSON_OBJECT("price",20))END
WHEREid = 1;
注意点:
1.请根据具体业务情况替换代码的中文注释,并确认存储数据符合JSON格式。
2.MySQL5.7以下版本不支持JSON相关函数。
3.更新后JSON数据会按照一定规则重新排序,暂不了解具体细节,有知道的朋友欢迎指点。
4.JSON相关函数介绍推荐以下博客
【MySQL】对JSON数据操作(全网最全)_mysql json_0世界和平0的博客-CSDN博客