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

PostgreSQL jsonb列新增嵌套属性的创建与更新方法咨询

问题描述

我有一个名为attributes的jsonb列,初始结构如下:

{
  "a:value": "123",
  "a:origin": "abc"
}

想要为该列新增一个属性,新增的属性结构是:

"abcKey:value": {
    "value": "123ABC",
    "version": "1"
  }

最终预期的attributes列结构为:

{
      "a:value": "123",
      "a:origin": "abc",
      "abcKey:value": {
        "value": "123ABC",
        "version": "1"
      }
    }

我尝试执行以下SQL语句,但执行失败:

update my_table
set attributes = jsonb_set(attributes, '{abcKey:value,value}', '"123ABC"')
attributes = jsonb_set(attributes, '{abcKey:value,version}', '"1"')
where ...; 

推测原因是需要先创建这个新属性,请问如何创建并更新这个新属性(最好一步完成)?

解决方案

你的推测没错——因为abcKey:value这个顶级键在初始jsonb里不存在,直接用jsonb_set设置它的子键会失败。这里有两种简洁的实现方法:

方法1:直接合并jsonb对象

利用PostgreSQL的||运算符,直接把新的jsonb对象合并到原列中,这是最直观的方式:

UPDATE my_table
SET attributes = attributes || '{"abcKey:value": {"value": "123ABC", "version": "1"}}'::jsonb
WHERE ...;

这个操作会直接将新的键值对添加到原jsonb中,如果原列已经存在abcKey:value键,会覆盖它的内容。

方法2:用jsonb_set一步创建嵌套结构

如果想要明确使用jsonb_set,可以先创建abcKey:value顶级键并设置其嵌套对象:

UPDATE my_table
SET attributes = jsonb_set(
    attributes,
    '{abcKey:value}',
    '{"value": "123ABC", "version": "1"}'::jsonb,
    true -- 第三个参数设为true,表示如果键不存在则创建
)
WHERE ...;

这里的第三个参数true是关键,它允许jsonb_set在目标路径不存在时自动创建对应的键。

原SQL失败的原因

你的原语句不仅存在语法错误(同一个SET子句里不能重复写attributes = ...),更核心的问题是abcKey:value这个顶级键不存在,直接设置它的子键value和version会因为路径无效而执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:55:59