HTML Diff
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 &lt;table&gt; ADD CONSTRAINT &lt;name&gt; CHECK (&lt;column&gt; IS NOT NULL) NOT VALID;<p>Тут<strong>NOT VALID</strong>сообщает СУБД PostgreSQL, что не нужно проводить полную проверку, чтобы убедиться, что все строки отвечают условию.</p>
4 ALTER TABLE &lt;table&gt; ADD CONSTRAINT &lt;name&gt; CHECK (&lt;column&gt; 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 &lt;table&gt; VALIDATE CONSTRAINT &lt;name&gt;;<p>Следует понимать, что выполнение данного выражения заблокирует получение других<strong>EXCLUSIVE</strong>-блокировок таблицы, однако записи/чтению он мешать не будет.</p>
6 ALTER TABLE &lt;table&gt; VALIDATE CONSTRAINT &lt;name&gt;;<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