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;