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

使用SQLite JSON1扩展更新单个JSON属性值的技术问询

解决SQLite中更新/插入单个JSON属性的问题

嘿,其实SQLite的JSON1扩展里的json_set()函数刚好能完美解决你的需求——它可以同时支持单个JSON属性的插入和更新:如果目标属性在JSON对象里不存在,就会新增这个属性;如果已经存在,就会覆盖它的值。

结合你的keywords表结构,我给你几个实用的例子:

基础用法:更新或插入单个属性

比如你想给lang=1、kwd='sqlite'的记录,更新或新增locs里的ny位置计数(第一次插入时默认从1开始,之后每次累加):

UPDATE keywords
SET locs = json_set(locs, '$.ny', COALESCE(json_extract(locs, '$.ny'), 0) + 1)
WHERE lang = 1 AND kwd = 'sqlite';

这里的COALESCE是为了处理属性不存在的情况:如果$.ny还没在locs里,json_extract会返回NULL,COALESCE就会用0来替代,再加1后就是1,实现第一次插入的效果。

直接插入新属性

如果只是想给指定记录的locs新增一个固定值的属性,比如给id=1的记录添加la位置,值设为5:

UPDATE keywords
SET locs = json_set(locs, '$.la', 5)
WHERE id = 1;

区分插入/更新的细分场景

如果你需要更精准的控制(比如只插入不更新,或者只更新不插入),SQLite 3.38.0及以上版本还提供了两个针对性的函数:

  • json_insert():仅插入不存在的属性,如果属性已经存在,不会做任何修改
    -- 只有当`tx`属性不存在时才插入,存在则保持原值
    UPDATE keywords
    SET locs = json_insert(locs, '$.tx', 1)
    WHERE kwd = 'android';
    
  • json_replace():仅更新已存在的属性,如果属性不存在,不会新增

同时操作多个属性

另外json_set()也支持一次操作多个属性,比如同时更新ny和新增chicago:

UPDATE keywords
SET locs = json_set(locs, '$.ny', 3, '$.chicago', 2)
WHERE lang = 2 AND kwd = 'json';

需要注意的是,你的locs字段是TEXT类型存储的JSON字符串,JSON1扩展会自动识别并处理这类字段,不需要额外的类型转换~

内容的提问来源于stack exchange,提问作者DroidOS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:09:08