Senior
61
Wie fügt man eine neue Spalte mit Standardwert in eine Tabelle in der Produktion ohne Sperrungen und Ausfallzeiten hinzu? Spezifikationen von PostgreSQL.
Unternehmen wurden gefragt
ТБанк
Antwort von AI
sobes.tech KI
В 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, если нужно.
Таким образом, на продакшене минимизируется блокировка и простой.