HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: postgresql, операции со столбцами</p>
1 <p>Теги: postgresql, операции со столбцами</p>
2 <p>В системе управления базами данных<strong>PostgreSQL</strong>для добавления столбца в уже существующую таблицу, как правило, требуется выполнить короткую блокировку уровня<strong>ACCESS EXCLUSIVE</strong>. Блокировка носит временный характер -- как раз на то время, которое потребуется для обновления системных таблиц каталогов (catalog tables). Рассмотрим нюансы этого процесса.</p>
2 <p>В системе управления базами данных<strong>PostgreSQL</strong>для добавления столбца в уже существующую таблицу, как правило, требуется выполнить короткую блокировку уровня<strong>ACCESS EXCLUSIVE</strong>. Блокировка носит временный характер -- как раз на то время, которое потребуется для обновления системных таблиц каталогов (catalog tables). Рассмотрим нюансы этого процесса.</p>
3 <h2>Установка дефолтных значений</h2>
3 <h2>Установка дефолтных значений</h2>
4 <p>Если устанавливать значения по умолчанию одновременно с созданием столбца, произойдет блокировка таблицы на время установки этих значений. Этого можно избежать следующим образом:</p>
4 <p>Если устанавливать значения по умолчанию одновременно с созданием столбца, произойдет блокировка таблицы на время установки этих значений. Этого можно избежать следующим образом:</p>
5 <ol><li>Добавляем новый столбец (без дефолтных значений).</li>
5 <ol><li>Добавляем новый столбец (без дефолтных значений).</li>
6 <li>Назначаем столбцу значение по умолчанию.</li>
6 <li>Назначаем столбцу значение по умолчанию.</li>
7 <li>Заполняем этим значением по умолчанию уже имеющиеся строки по отдельности.</li>
7 <li>Заполняем этим значением по умолчанию уже имеющиеся строки по отдельности.</li>
8 </ol><h2>Важно!</h2>
8 </ol><h2>Важно!</h2>
9 <p>В том же PostgreSQL 11 такие советы будут не актуальны для неволатильных дефолтных значений. Теперь добавление столбца с дефолтным значением потребует лишь обновления таблиц каталогов, тогда как все обращения к строкам без значения станут "магическим" образом возвращать необходимое значение.</p>
9 <p>В том же PostgreSQL 11 такие советы будут не актуальны для неволатильных дефолтных значений. Теперь добавление столбца с дефолтным значением потребует лишь обновления таблиц каталогов, тогда как все обращения к строкам без значения станут "магическим" образом возвращать необходимое значение.</p>
10 <h2>Ограничения NOT NULL</h2>
10 <h2>Ограничения NOT NULL</h2>
11 <p>Добавить столбец с NOT NULL-ограничением можно лишь в 2-х случаях:</p>
11 <p>Добавить столбец с NOT NULL-ограничением можно лишь в 2-х случаях:</p>
12 <ul><li>в таблице отсутствуют строки. Это тривиальный случай и потребуется лишь изменение каталога;</li>
12 <ul><li>в таблице отсутствуют строки. Это тривиальный случай и потребуется лишь изменение каталога;</li>
13 <li>был указан DEFAULT. В этой ситуации надо будет проделать действия, описанные выше для дефолтных значений.</li>
13 <li>был указан DEFAULT. В этой ситуации надо будет проделать действия, описанные выше для дефолтных значений.</li>
14 </ul><h2>Внимание!</h2>
14 </ul><h2>Внимание!</h2>
15 <p>После того, как новый столбец будет добавлен, все запросы типа SELECT * FROM ... станут возвращать этот новый столбец. При этом важно и то, чтобы код, который станет работать с данной таблицей, смог безопасно обрабатывать новый столбец. Простая рекомендация -- не используйте * и всегда указывайте столбцы явно.</p>
15 <p>После того, как новый столбец будет добавлен, все запросы типа SELECT * FROM ... станут возвращать этот новый столбец. При этом важно и то, чтобы код, который станет работать с данной таблицей, смог безопасно обрабатывать новый столбец. Простая рекомендация -- не используйте * и всегда указывайте столбцы явно.</p>
16 <p><em>По материалам статьи "<a>PostgreSQL at Scale: Database Schema Changes Without Downtime</a>".</em></p>
16 <p><em>По материалам статьи "<a>PostgreSQL at Scale: Database Schema Changes Without Downtime</a>".</em></p>
17  
17