Добавляем столбец в PostgreSQL
В системе управления базами данных PostgreSQL для добавления столбца в уже существующую таблицу, как правило, требуется выполнить короткую блокировку уровня ACCESS EXCLUSIVE. Блокировка носит временный характер -- как раз на то время, которое потребуется для обновления системных таблиц каталогов (catalog tables). Рассмотрим нюансы этого процесса.
Установка дефолтных значений
Если устанавливать значения по умолчанию одновременно с созданием столбца, произойдет блокировка таблицы на время установки этих значений. Этого можно избежать следующим образом:
- Добавляем новый столбец (без дефолтных значений).
- Назначаем столбцу значение по умолчанию.
- Заполняем этим значением по умолчанию уже имеющиеся строки по отдельности.
Важно!
В том же PostgreSQL 11 такие советы будут не актуальны для неволатильных дефолтных значений. Теперь добавление столбца с дефолтным значением потребует лишь обновления таблиц каталогов, тогда как все обращения к строкам без значения станут "магическим" образом возвращать необходимое значение.
Ограничения NOT NULL
Добавить столбец с NOT NULL-ограничением можно лишь в 2-х случаях:
- в таблице отсутствуют строки. Это тривиальный случай и потребуется лишь изменение каталога;
- был указан DEFAULT. В этой ситуации надо будет проделать действия, описанные выше для дефолтных значений.
Внимание!
После того, как новый столбец будет добавлен, все запросы типа
По материалам статьи «PostgreSQL at Scale: Database Schema Changes Without Downtime».