0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: postgresql, ограничения, not null</p>
1
<p>Теги: postgresql, ограничения, not null</p>
2
<p>Удаление ограничения<strong>NOT NULL</strong>из столбца PostgreSQL потребует полной блокировки таблицы. Но это не проблема, ведь речь идет о простом обновлении каталога. Однако когда мы говорим о добавлении ограничения<strong>NOT NULL</strong>к уже существующему столбцу, все становится интереснее. Дело в том, что вышеуказанная операция потребует на время проведения полного скана таблицы<strong>ACCESS EXCLUSIVE</strong>, так как необходимо убедиться, что null-значения отсутствуют. Но мы можем пойти и другим путем:</p>
2
<p>Удаление ограничения<strong>NOT NULL</strong>из столбца PostgreSQL потребует полной блокировки таблицы. Но это не проблема, ведь речь идет о простом обновлении каталога. Однако когда мы говорим о добавлении ограничения<strong>NOT NULL</strong>к уже существующему столбцу, все становится интереснее. Дело в том, что вышеуказанная операция потребует на время проведения полного скана таблицы<strong>ACCESS EXCLUSIVE</strong>, так как необходимо убедиться, что null-значения отсутствуют. Но мы можем пойти и другим путем:</p>
3
<p>1.Добавить ограничение проверки<strong>CHECK</strong>, которое станет требовать от значений столбца не быть null. Реализовать это можно посредством следующей команды:</p>
3
<p>1.Добавить ограничение проверки<strong>CHECK</strong>, которое станет требовать от значений столбца не быть null. Реализовать это можно посредством следующей команды:</p>
4
ALTER TABLE <table> ADD CONSTRAINT <name> CHECK (<column> IS NOT NULL) NOT VALID;<p>Тут<strong>NOT VALID</strong>сообщает СУБД PostgreSQL, что не нужно проводить полную проверку, чтобы убедиться, что все строки отвечают условию.</p>
4
ALTER TABLE <table> ADD CONSTRAINT <name> CHECK (<column> IS NOT NULL) NOT VALID;<p>Тут<strong>NOT VALID</strong>сообщает СУБД PostgreSQL, что не нужно проводить полную проверку, чтобы убедиться, что все строки отвечают условию.</p>
5
<p>2.Вручную проверить, что все строки содержат значения, которые отличны от null. При этом валидировать наложенное ограничение мы можем следующим образом:</p>
5
<p>2.Вручную проверить, что все строки содержат значения, которые отличны от null. При этом валидировать наложенное ограничение мы можем следующим образом:</p>
6
ALTER TABLE <table> VALIDATE CONSTRAINT <name>;<p>Следует понимать, что выполнение данного выражения заблокирует получение других<strong>EXCLUSIVE</strong>-блокировок таблицы, однако записи/чтению он мешать не будет.</p>
6
ALTER TABLE <table> VALIDATE CONSTRAINT <name>;<p>Следует понимать, что выполнение данного выражения заблокирует получение других<strong>EXCLUSIVE</strong>-блокировок таблицы, однако записи/чтению он мешать не будет.</p>
7
<p><em>Источник: https://medium.com/paypal-tech/postgresql-at-scale-database-schema-changes-without-downtime-20d3749ed680.</em></p>
7
<p><em>Источник: https://medium.com/paypal-tech/postgresql-at-scale-database-schema-changes-without-downtime-20d3749ed680.</em></p>
8
8