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
相关产品推荐
相关产品推荐

