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

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

от cloyd , в категории: SQL , 7 месяцев назад

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

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

от jamey.kohler , 7 месяцев назад

@cloyd 

Существует несколько способов добавления нового поля в существующую таблицу в PostgreSQL без блокировки:

  1. Используйте команду ALTER TABLE с опцией ADD COLUMN и столбцом, который вы хотите добавить. Однако это может заблокировать таблицу на запись, если есть активные транзакции, которые изменяют таблицу. Чтобы избежать блокировки, можно использовать опцию CONCURRENTLY, которая создает временную таблицу с новым столбцом, копирует данные из старой таблицы в новую и затем заменяет старую таблицу новой. Пример:ALTER TABLE mytable ADD COLUMN newcolumn TEXT; -- Использование опции CONCURRENTLY ALTER TABLE mytable ADD COLUMN newcolumn TEXT CONCURRENTLY;
  2. Используйте команду 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 - это значение по умолчанию для нового столбца.
  3. Используйте расширение pg_repack, которое позволяет перепаковывать таблицы без блокировки. Пример:-- Установка расширения pg_repack CREATE EXTENSION pg_repack; -- Добавление нового столбца с помощью pg_repack ALTER TABLE mytable ADD COLUMN newcolumn TEXT; SELECT pg_repack('mytable', 'newcolumn'); Этот способ может быть медленнее, чем первые два, но он позволяет добавлять столбцы без блокировки таблицы на запись и чтение.