PostgreSQL JSONB-通过单个查询更新所有行的键名

时间:2019-04-17 18:14:26

标签: ruby-on-rails postgresql activerecord jsonb

我在PostgreSQL表中有一个jsonb字段,我只想更改键名,并保持相同的值。

当前,我正在Rails中执行以下操作:

Event.each do |event|
   event.metadata['new_key'] = metadata['old_key']
   event.metadata.delete('old_key')
   event.save
end

是否有一种方法可以使用单个update_all查询获得相同的结果?

1 个答案:

答案 0 :(得分:2)

假设使用顶级密钥和最新的PostgreSQL,
您可以通过删除旧键并添加新键-从旧键复制的值来实现此目的:

UPDATE event
SET    metadata = (metadata - 'old_key')
               || jsonb_build_object('new_key', metadata->'old_key')
WHERE  metadata ? 'old_key';  -- only where the key exists

db <>提琴here