【问题标题】:Upgrade PostgreSQL JSON column to JSONB?将 PostgreSQL JSON 列升级到 JSONB?
【发布时间】:2026-01-14 05:10:01
【问题描述】:

升级到 PostgreSQL 9.4 后,如何将我的所有 JSON 列转换为 JSONB 列?

我不介意丢失任何重复的键和空格。

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:
    ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;
    

    【讨论】:

      【解决方案2】:

      在 Rails 的上下文中,这是一个 ActiveRecord 迁移替代方案:

      def change
        reversible do |dir|
          dir.up { change_column :models, :attribute, 'jsonb USING CAST(attribute AS jsonb)' }
          dir.down { change_column :models, :attribute, 'json USING CAST(attribute AS json)' }
        end
      end
      

      我在一个有 120 000 条记录的表上对此进行了测试,每条记录有四个 json 列,我花了大约一分钟来迁移该表。当然,这取决于json 结构的复杂程度。

      另外,请注意,如果您现有的记录有默认值{},您必须在上述语句中添加default: {},否则您将拥有jsonb 列,但默认值将保持为'{}'::json.

      【讨论】: