Начиная с PostgreSQL v12, было бы лучше использовать сгенерированные столбцы :
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;
Это потребует переписывания таблицы, так что это займет некоторое время и пространство, но в любом случае невозможно избежать перезаписи таблицы такой операцией. Вы можете уменьшить влияние, выполнив это за один ALTER TABLE
, как указано выше.
Для более старых версий баз данных вы должны сделать это в следующих шагах:
- запустить транзакцию, чтобы следующие шаги блокируют доступ к таблице
- добавить (обнуляемые) столбцы
- заполнить столбцы одним
UPDATE
- повернуть столбцы
NOT NULL
при желании - создать триггер, который автоматически заполняет новые столбцы
- зафиксировать транзакцию
Помимо обеспечения атомарности, транзакция гарантирует, что новые строки не будут добавлены до того, как триггер будет на месте.
После этого было бы неплохо VACUUM (FILL)
стол (еще больше простоя), чтобы избавиться от наворотов от UPDATE
.