Проекты развиваются, клиентская база увеличивается, базы данных разрастаются, и наступает момент, когда мы начинаем замечать, что некогда простые манипуляции над базами данных требуют более сложных действий, а цена ошибки сильно повышается. Уже нельзя за раз промигрировать данные с одного столбца в другой, индексы лучше накатывать асинхронно, добавлять столбцы с default
значениями теперь нельзя.
Одной из команд, с которой надо быть осторожным на таблицах с большим количеством записей, является добавление not null constraint
на столбец. При добавлении данного constraint
PostgreSQL приобретает access exclusive lock
на таблицу, в результате чего другие сессии не могут временно даже читать таблицу; затем БД проверяет, что в столбце действительно ни одного null
нет, и только после этого вносятся изменения. Под катом я рассмотрю различные варианты, как можно добавить not null constraint
, лоча таблицу на минимально возможное время или даже не лоча ее совсем.
TL;DR:
- В PostgreSQL 12+ можно добавить
check constraint
на таблицу, а затем "преобразовать" его вnot null constraint
для конкретного столбца. - Чтобы полностью избежать блокировки таблицы, можно напрямую внести изменения в системную таблицу
pg_attribute
(этот пункт подробно разбирается в статье).