PostgreSQL:如何使用同表其他列更新jsonb类型数据?
用同表列值更新PostgreSQL jsonb字段的正确方法
你遇到的错误是因为直接将表列test.uuid写入了JSON字符串中——PostgreSQL会把这个字符串当作纯JSON解析,而test.uuid并不是合法的JSON语法,因此报错。
以下是两种正确实现需求的方法:
方法1:使用jsonb_build_object拼接JSON
通过jsonb_build_object函数动态构造要添加的JSON对象,它可以直接引用表列值并自动处理类型转换:
UPDATE test SET json_data = json_data || jsonb_build_object( 'xyz', jsonb_build_object('enabled', false, 'uuid', uuid) );
方法2:使用jsonb_set精确设置路径
如果需要指定JSON对象的嵌套路径来插入或更新值,jsonb_set是更精准的选择:
UPDATE test SET json_data = jsonb_set( json_data, '{xyz}', jsonb_build_object('enabled', false, 'uuid', uuid) );
注:
jsonb_set的第四个参数默认为true,表示当目标路径不存在时自动插入,无需额外指定。
执行上述任一语句后,json_data字段会被正确更新为你期望的结构:
uuid | name | json_data --------------------------------------+------+----------------------------------------------------------- 12345678-3ffd-472b-ac39-31eacc4a6785 | foo | {"id": 1132, "xyz":{"enabled": false, "uuid": "12345678-3ffd-472b-ac39-31eacc4a6785"}}
内容的提问来源于stack exchange,提问作者Mari Kotlov
相关产品推荐
相关产品推荐

