mysql JSON_SET 遇到的坑

项目中使用json字段更新碰到的坑

使用JSON_SET()更新jons字段

事故sql
UPDATE tableName
SET extend_json = JSON_SET( IFNULL( extend_json, '{}' ), '$.mallServer.url', '222' ),
extend_json = JSON_SET( IFNULL( extend_json, '{}' ), '$.belongHongKong', 0 ) 
WHERE id = 4;

问题

extend_json 中包含有mallServer.url这个key的时候更新正常,但是当extend_json 不包含mallServer.url这个key的时候只有belongHongKong这个key能正常更新,而mallServer.url不会被更新上去,

最后经过排查发现使用JSON_SET()进行更新的时候,如果key只有一层belongHongKong)无论json字段是否包含key都会执行没有插入有则更新,但是如果key存在两层或以上mallServer.url且josn中不包含此key在使用JSON_SET()则不会进行插入操作

解决

使用JSON_OBJECT(), 将多层key转化包装成json对象
优化sql如下

UPDATE tableName
SET extend_json = JSON_SET( IFNULL( extend_json, '{}' ), '$.mallServer', JSON_OBJECT( "url", '22222' ) ),
extend_json = JSON_SET( IFNULL( extend_json, '{}' ), '$.belongHongKong', 0 ) 
WHERE
 id = 3;

结果:无论是否有有key,多层的key也可以插入或者更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值