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

PostgreSQL中jsonb[]数组元素属性重命名方案咨询

当然可以纯用PostgreSQL搞定,完全不用写外部代码提取数据再修改!我给你两种直接在数据库层面操作的方案,亲测有效:

方案1:通用版(兼容所有支持jsonb的PG版本)

用unnest展开数组,逐个修改元素后再聚合回去,核心是通过键删除+新增的逻辑实现重命名:

UPDATE menu_items
SET build_items = (
  SELECT array_agg(
    -- 先移除旧的item_id键,再添加新的value键并赋值原item_id的值
    jsonb_set((elem - 'item_id'), '{value}', elem->'item_id')
  )
  FROM unnest(build_items) AS elem
);

步骤拆解:

  • unnest(build_items):把jsonb[]类型的数组拆成单个jsonb元素,方便逐个处理
  • elem - 'item_id':移除当前元素里的item_id键
  • jsonb_set(..., '{value}', elem->'item_id'):给元素新增value键,值沿用原来item_id的内容
  • array_agg(...):把修改后的所有元素重新组合成jsonb[]数组,赋值回原字段

方案2:简洁版(PG 12+ 可用)

如果你的PostgreSQL版本是12或以上,可以用jsonb_transform_keys函数批量修改键名,代码更简洁直观:

UPDATE menu_items
SET build_items = (
  SELECT array_agg(
    jsonb_transform_keys(elem, k -> CASE k WHEN 'item_id' THEN 'value' ELSE k END)
  )
  FROM unnest(build_items) AS elem
);

说明:

jsonb_transform_keys会遍历每个jsonb元素的所有键,当遇到item_id时就替换成value,其他键保持原样,非常适合需要批量修改多个键的场景。


重要提醒

  • 先备份再操作:不管用哪个方案,建议先在测试环境验证,或者给表做个备份,避免意外数据损失
  • 优化更新范围:如果不是所有行都有需要修改的item_id,可以加个WHERE条件缩小更新范围,提升性能:
    UPDATE menu_items
    SET build_items = (...)
    WHERE EXISTS (
      SELECT 1 FROM unnest(build_items) elem WHERE elem ? 'item_id'
    );
    
  • 空元素兼容:如果数组里有元素没有item_id键,两种方案都不会报错,只会跳过该元素的修改,兼容性拉满

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:46:31