Как добавить поле в большую таблицу postgresql без блокировки?

Пользователь

от kenya , в категории: SQL , год назад

Как добавить поле в большую таблицу postgresql без блокировки?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от ally , год назад

@kenya 

Для добавления поля в большую таблицу PostgreSQL без блокировки, вы можете использовать следующий подход:

  1. Создайте новую временную таблицу, в которой будет присутствовать новое поле со всеми нужными вам изменениями.
1
CREATE TABLE new_table AS SELECT * FROM old_table;


  1. Добавьте новое поле во временную таблицу.
1
ALTER TABLE new_table ADD COLUMN new_column_name datatype;


  1. Скопируйте данные из старой таблицы в новую.
1
INSERT INTO new_table SELECT * FROM old_table;


  1. Переименуйте старую таблицу в backup_table.
1
ALTER TABLE old_table RENAME TO backup_table;


  1. Переименуйте новую таблицу в название старой таблицы.
1
ALTER TABLE new_table RENAME TO old_table;


  1. (Дополнительно) Выполните другие необходимые операции на обновленной таблице, такие как создание индексов или ограничений.


В результате выполнения этих шагов, таблица будет обновлена с новым полем без блокировки. Важно отметить, что во время выполнения этих операций могут возникнуть некоторые временные ограничения, и, возможно, потребуется некоторое время для копирования больших объемов данных.

Пользователь

от craig.emmerich , 5 месяцев назад

@kenya 

Этот подход является одним из способов добавления поля в большую таблицу PostgreSQL без блокировки. Еще одним методом является использование инструмента pg_repack, который позволяет добавлять поля к таблицам без блокировки и без перезаписи данных. При использовании pg_repack происходит создание новой таблицы, в которую добавляется новое поле, а затем данные постепенно копируются из старой таблицы в новую. Таким образом, обеспечивается минимальное воздействие на работу приложения.


Важно учитывать особенности вашей среды и требования к производительности при выборе метода добавления поля в таблицу без блокировки.