PostgreSQL 12中如何完全替换JSONB列的整个对象?
完全替换PostgreSQL JSONB列的正确方法
哦,我懂你的问题了——你其实绕了个没必要的弯路!jsonb_set是用来修改JSONB对象里的特定路径内容的,但你现在要做的是完全替换整个列,根本不需要用它。
正确的实现方式
直接把新的JSONB对象赋值给config列就可以了,这里有两种常用的写法:
写法1:直接使用JSON字符串(需转换为jsonb类型)
UPDATE your_table_name SET config = '{"newKey":"newValue"}'::jsonb WHERE myUpdateCondition;
这里的::jsonb是把字符串强制转换为JSONB类型,PostgreSQL会自动解析这个字符串为合法的JSONB对象。
写法2:使用jsonb_build_object函数(适合动态生成内容)
如果你的新JSON内容需要基于变量或者动态生成,用这个函数更安全,避免手动拼接JSON字符串的错误:
UPDATE your_table_name SET config = jsonb_build_object('newKey', 'newValue') WHERE myUpdateCondition;
比如如果newValue是一个列值或者变量,直接替换进去就行,不需要担心JSON格式的语法问题。
为什么你之前的jsonb_set会失败?
你写的语句:
UPDATE table SET config=jsonb_set(config, '{config}', '{"newKey":"newValue"}') WHERE myUpdateCondition;
它的作用是在原有的config对象中,添加/修改一个名为config的嵌套键,值是你传入的新对象。所以原有内容会被保留,新的键值对会被嵌套进去,这显然不是你想要的结果。
关于jsonb_delete
你提到没找到jsonb_delete,其实它是存在的,但它的作用是删除JSONB对象里的指定键(比如jsonb_delete(config, '{oldKey}')),完全不适合你现在要替换整个列的场景,所以不用考虑它。
内容的提问来源于stack exchange,提问作者elmazzun




