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