@cloyd
Существует несколько способов добавления нового поля в существующую таблицу в PostgreSQL без блокировки:
- Используйте команду ALTER TABLE с опцией ADD COLUMN и столбцом, который вы хотите добавить. Однако это может заблокировать таблицу на запись, если есть активные транзакции, которые изменяют таблицу. Чтобы избежать блокировки, можно использовать опцию CONCURRENTLY, которая создает временную таблицу с новым столбцом, копирует данные из старой таблицы в новую и затем заменяет старую таблицу новой. Пример:ALTER TABLE mytable ADD COLUMN newcolumn TEXT;
-- Использование опции CONCURRENTLY
ALTER TABLE mytable ADD COLUMN newcolumn TEXT CONCURRENTLY;
- Используйте команду CREATE TABLE AS для создания временной таблицы с новым столбцом, скопируйте данные из старой таблицы в новую и затем переименуйте старую таблицу и временную таблицу. Это можно сделать без блокировки таблицы на запись, но таблица на чтение будет заблокирована до завершения операции. Пример:CREATE TABLE mytable_new AS SELECT *, 'default_value' AS newcolumn FROM mytable;
ALTER TABLE mytable RENAME TO mytable_old;
ALTER TABLE mytable_new RENAME TO mytable;
Здесь default_value - это значение по умолчанию для нового столбца.
- Используйте расширение pg_repack, которое позволяет перепаковывать таблицы без блокировки. Пример:-- Установка расширения pg_repack
CREATE EXTENSION pg_repack;
-- Добавление нового столбца с помощью pg_repack
ALTER TABLE mytable ADD COLUMN newcolumn TEXT;
SELECT pg_repack('mytable', 'newcolumn');
Этот способ может быть медленнее, чем первые два, но он позволяет добавлять столбцы без блокировки таблицы на запись и чтение.