Back to questions
Senior
7
Как добавить новую колонку с дефолтным значением в таблицу на проде без блокировок и простоя? Специфика PostgreSQL.
Companies where asked
ТБанк
Answer from AI
sobes.tech AI
В PostgreSQL начиная с версии 11 можно добавить новую колонку с дефолтным значением без блокировок и долгих операций, если дефолт — это константа (не выражение). Это связано с тем, что раньше добавление колонки с дефолтом приводило к полному переписыванию таблицы, что блокировало её.
Правильный способ:
ALTER TABLE your_table ADD COLUMN new_column type DEFAULT your_default_value;
Если вы используете PostgreSQL 11+, то это выполнится быстро и без блокировок, так как дефолтное значение не записывается сразу в каждую строку, а используется на уровне метаданных.
Если версия ниже, то рекомендуют:
- Добавить колонку без дефолта и с NULL:
ALTER TABLE your_table ADD COLUMN new_column type;
-
Обновить данные партиями (batch update) в фоне, чтобы заполнить дефолтное значение.
-
Установить дефолтное значение для колонки:
ALTER TABLE your_table ALTER COLUMN new_column SET DEFAULT your_default_value;
- Сделать колонку NOT NULL, если нужно.
Таким образом, на продакшене минимизируется блокировка и простой.