讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在PostgreSQL 15中用SQL更新JSONB字段的嵌套属性?

大涛姑娘_6004

大涛姑娘_6004

发布时间:2026-09-01 10:05:27

|

476人浏览过

|

来源于php中文网

原创

PostgreSQL 15 中更新 JSONB 嵌套字段最稳妥方式是 jsonb_set(),它只修改指定路径、不丢失同级字段;需注意路径为 text[]、值为 jsonb 类型、缺失路径需显式设 create_missing=true。

如何在postgresql 15中用sql更新jsonb字段的嵌套属性?

直接用 jsonb_set() 更新嵌套路径,别用 || 拼接

PostgreSQL 15 中更新 JSONB 嵌套字段最稳妥的方式是 jsonb_set(),不是用 || 合并或 #> 提取后重赋值。后者容易丢失同级其他字段,尤其当路径不存在时会静默失败或返回 null。

比如想把 data->'user'->'profile'->'age' 改成 35:

UPDATE users
SET data = jsonb_set(data, '{user,profile,age}', '35')
WHERE id = 123;

关键点:

  • jsonb_set() 第二个参数必须是 text[](如 '{user,profile,age}'),不能写成字符串 'user.profile.age'
  • 第三个参数必须是 jsonb 类型,所以数字要加单引号转成字符串再由 PostgreSQL 自动转 jsonb,或显式写 to_jsonb(35)
  • 默认行为是路径不存在时创建(create_missing = true),设为 false 可跳过更新

处理数组内对象的嵌套更新要先定位索引

JSONB 数组里改某个对象的字段,得先知道下标。PostgreSQL 不支持类似 $.items[?(@.id==123)].status 的 JSONPath 写法(15 版本原生不支持 JSONPath 更新,仅查询可用)。

常见做法是:用 jsonb_array_elements() 展开 + WITH ORDINALITY 记录位置,再拼回数组。但更轻量的是用 jsonb_set() 配合已知索引:

UPDATE orders
SET items = jsonb_set(
  items,
  ARRAY['1', 'status'],  -- 把第 2 个元素(索引从 0 开始)的 status 改掉
  '"shipped"',
  true
)
WHERE id = 456;

注意:

OpenGemini Next.js Bestpractice Builder
OpenGemini Next.js Bestpractice Builder

使用固定的 Next.js/Tailwind/Prisma 技术栈构建并记录独立 SaaS 项目,仅将 FastAPI 用于 Python 工作负载,并遵循严格的架构规范。

下载
  • 数组索引必须是字符串('1'),不是数字 1
  • 如果不确定索引,得先用子查询找位置,例如 SELECT idx FROM jsonb_array_elements(items) WITH ORDINALITY AS e(elem, idx) WHERE elem->>'id' = '123'
  • 对数组整体操作性能较差,频繁更新建议把数组项拆到关联表

更新时避免意外覆盖顶层结构

错误写法:SET data = data || '{"user": {"profile": {"age": 35}}}' —— 这会把整个 user 对象替换成新对象,丢掉原来 user->'settings' 或 user->'avatar' 等字段。

正确思路是只触达目标路径:

  • 用 jsonb_set() 是最安全的,它只改指定路径,不动其他
  • 若需多层合并(比如更新 user.profile 下多个字段),可嵌套调用:jsonb_set(jsonb_set(data, '{user,profile,age}', '35'), '{user,profile,city}', '"Beijing"')
  • 或者先提取父对象,合并后再写回:jsonb_set(data, '{user,profile}', (data#>'{user,profile}') || '{"age": 35, "city": "Beijing"}'),但要注意 #> 返回 jsonb,|| 才能生效

空值和缺失路径的边界情况要显式处理

jsonb_set() 在路径中间某段为 null 时,默认不创建(除非 create_missing = true)。比如 data 是 {"user": {}},执行 jsonb_set(data, '{user,profile,age}', '35') 不会报错,但也不会写入——因为 profile 不存在,且 create_missing 默认是 false。

解决方法:

  • 强制创建缺失层级:jsonb_set(data, '{user,profile,age}', '35', true)
  • 先检查路径是否存在:data ? 'user' AND data->'user' ? 'profile',再决定是否更新
  • 用 COALESCE 提供默认空对象:jsonb_set(COALESCE(data->'user'->'profile', '{}'), '{age}', '35'),但这只是局部操作,需配合外层 jsonb_set 写回

真正难的不是语法,而是想清楚“这个字段在业务里是否允许为空”“上游数据会不会突然少一层”,这些逻辑得在 SQL 外围或应用层兜底。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2095

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3122

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1056

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3559

2025.09.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4429

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

647

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1396

2023.11.20

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

0

2026.10.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn