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

PostgreSQL UPDATE语句中类型转换失效及JSON键更新方法

问题解析与解决方法

为什么UPDATE时类型转换不可用?

PostgreSQL的UPDATE语句里,SET后面的左侧必须是可直接赋值的目标(比如表的列名),而address::jsonb->'pincode'是把text列临时转成jsonb后提取键值的表达式——它只是计算出来的临时值,不是实际存储的列,自然没法直接赋值。而且类型转换是临时操作,原列还是text类型,数据库无法把修改直接映射回原text列。

仅更新JSON单个键的正确方法

因为原列是text类型,需要先把它转成jsonb,修改指定键后再转回text存回原列,具体有两种常用写法:

方法1:用jsonb合并操作(适合简单键值修改)

UPDATE students 
SET address = (address::jsonb || '{"pincode": "182741"}'::jsonb)::text
WHERE id = 'abc';

方法2:用jsonb_set函数(适合嵌套JSON或需明确路径的场景)

UPDATE students 
SET address = jsonb_set(address::jsonb, '{pincode}', '"182741"')::text
WHERE id = 'abc';

关键逻辑说明:

  • address::jsonb:把原text列转成可操作的jsonb类型
  • ||/jsonb_set:修改jsonb对象的指定键值(||是合并操作,新键值会覆盖旧值;jsonb_set更灵活,支持多级嵌套路径)
  • ::text:把修改后的jsonb转回text类型,重新赋值给原address列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:21:30