Postgresql 在其他字段中添加列并将默认值设置为值

Postgresql 在其他字段中添加列并将默认值设置为值,postgresql,Postgresql,我的数据库中有一个表需要重新构造。目前看起来是这样的: id | attrs ----+-------------------------------------------------------------------------------------- 1 | {"type": "test_type", "m_attrs": {"left_values": "Jack", "right_values": "John"}} 但是,我想更改此表,并将at

我的数据库中有一个表需要重新构造。目前看起来是这样的:

id  |              attrs  
----+--------------------------------------------------------------------------------------
  1 | {"type": "test_type", "m_attrs": {"left_values": "Jack", "right_values": "John"}}
但是,我想更改此表,并将
attrs
列拆分为
类型
左值
右值

alter table t_name add column if not exists type text;
alter table t_name add column if not exists left_values text;
alter table t_name add column if not exists right_values text;
使这些列不为null并将其默认值设置为现有attrs列中的值的最佳方法是什么,即:
attrs->m\u attrs->>“左值”


表的行数非常大,因此我也担心性能问题。

从PostgreSQL v12开始,最好使用生成的列:

这将需要重写表,因此需要一些时间和空间,但无论如何都无法避免使用这样的操作重写表。您可以通过在一个
ALTER表中执行上述操作来减少影响

对于较旧的数据库版本,必须分步骤执行:

  • 启动事务,以便接下来的步骤阻止对表的访问
  • 添加(可为空)列
  • 用一个
    UPDATE
  • 如果需要,将列
    设置为非空
  • 创建自动填充新列的触发器
  • 提交事务
除了提供原子性之外,事务还确保在触发器就位之前不添加新行

在那之后,最好是
真空(填充)
表格(还有更多的停机时间),以消除
更新中的膨胀

ALTER TABLE t_name
   ADD "type" text GENERATED ALWAYS AS (attrs->>'type') STORED,
   ADD left_values text GENERATED ALWAYS AS (attrs->'m_attrs'->>'left_values') STORED,
   ADD right_values text GENERATED ALWAYS AS (attrs->'m_attrs'->>'right_values') STORED;