Sobes.tech
Senior

¿Cómo agregar una nueva columna con un valor predeterminado en una tabla en producción sin bloqueos ni tiempo de inactividad? Especificidad de PostgreSQL.

sobes.tech AI

Respuesta de la IA

В PostgreSQL начиная с версии 11 можно добавить новую колонку с дефолтным значением без блокировок и долгих операций, если дефолт — это константа (не выражение). Это связано с тем, что раньше добавление колонки с дефолтом приводило к полному переписыванию таблицы, что блокировало её.

Правильный способ:

ALTER TABLE your_table ADD COLUMN new_column type DEFAULT your_default_value;

Если вы используете PostgreSQL 11+, то это выполнится быстро и без блокировок, так как дефолтное значение не записывается сразу в каждую строку, а используется на уровне метаданных.

Если версия ниже, то рекомендуют:

  1. Добавить колонку без дефолта и с NULL:
ALTER TABLE your_table ADD COLUMN new_column type;
  1. Обновить данные партиями (batch update) в фоне, чтобы заполнить дефолтное значение.

  2. Установить дефолтное значение для колонки:

ALTER TABLE your_table ALTER COLUMN new_column SET DEFAULT your_default_value;
  1. Сделать колонку NOT NULL, если нужно.

Таким образом, на продакшене минимизируется блокировка и простой.