Содержание статьи

В PostgreSQL добавление нового столбца выполняется с помощью команды ALTER TABLE. Этот подход позволяет расширять структуру таблицы без её полной пересоздании, сохраняя существующие данные и индексы.
При добавлении столбца важно правильно выбрать тип данных. Неправильный тип может привести к лишним преобразованиям и замедлению запросов. Для текстовых данных используют VARCHAR или TEXT, для числовых – INTEGER, BIGINT или NUMERIC.
Для столбцов с обязательными значениями применяют ограничение NOT NULL. Если таблица уже содержит данные, необходимо указать значение по умолчанию, иначе команда завершится ошибкой.
При работе с крупными таблицами добавление столбца может блокировать другие операции. В таких случаях рекомендуется использовать ALTER TABLE … ADD COLUMN … DEFAULT … с последующим удалением значения по умолчанию для минимизации времени блокировки.
Синтаксис команды ALTER TABLE для добавления столбца

Для добавления нового столбца используется команда ALTER TABLE имя_таблицы ADD COLUMN имя_столбца тип_данных. Например, чтобы добавить столбец age с типом INTEGER в таблицу users, выполняют: ALTER TABLE users ADD COLUMN age INTEGER;.
Можно сразу указать значение по умолчанию: ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;. Это присвоит всем существующим строкам текущее время.
Для столбцов с обязательными значениями применяют ограничение NOT NULL: ALTER TABLE users ADD COLUMN email VARCHAR(255) NOT NULL;. Если таблица уже содержит данные, необходимо указать DEFAULT, иначе команда завершится ошибкой.
Команда поддерживает добавление нескольких столбцов за один вызов через запятую: ALTER TABLE users ADD COLUMN phone VARCHAR(20), ADD COLUMN status BOOLEAN DEFAULT TRUE;. Такой синтаксис сокращает количество операций и уменьшает блокировки.
Выбор типа данных при добавлении нового столбца
Тип данных определяет, какие значения можно хранить и как PostgreSQL будет обрабатывать запросы. Ошибочный выбор может вызвать лишние преобразования и снизить производительность.
Основные группы типов данных:
- Числовые: INTEGER, BIGINT, NUMERIC, REAL, DOUBLE PRECISION. Используются для целых чисел, дробных значений и финансовых расчётов.
- Текстовые: CHAR(n), VARCHAR(n), TEXT. TEXT не ограничен длиной, VARCHAR позволяет контролировать максимальную длину.
- Дата и время: DATE, TIME, TIMESTAMP, TIMESTAMPTZ. TIMESTAMPTZ учитывает временную зону.
- Булевы: BOOLEAN. Хранят TRUE или FALSE, экономят место.
- UUID и специальные типы: UUID, JSON, JSONB, ARRAY. Используются для уникальных идентификаторов, хранения структурированных данных или массивов.
Рекомендации при выборе:
- Для чисел без дробной части используйте INTEGER или BIGINT в зависимости от диапазона.
- Для длинных текстов применяйте TEXT, для ограниченных строк – VARCHAR(n).
- Для временных меток с учётом временной зоны выбирайте TIMESTAMPTZ, без зоны – TIMESTAMP.
- Для флагов состояния используйте BOOLEAN, вместо числовых 0/1.
- Для хранения JSON данных предпочтителен JSONB из-за быстрого поиска и индексации.
Добавление столбца с ограничением NOT NULL

Ограничение NOT NULL запрещает хранение пустых значений в столбце. Оно гарантирует, что каждая строка таблицы будет содержать данные.
При добавлении столбца с NOT NULL важно учитывать существующие данные. Если таблица не пуста, необходимо указать DEFAULT, иначе команда завершится ошибкой. Пример:
ALTER TABLE users ADD COLUMN email VARCHAR(255) NOT NULL DEFAULT »;
После добавления столбца с DEFAULT значение по умолчанию можно удалить для экономии места:
ALTER TABLE users ALTER COLUMN email DROP DEFAULT;
Для больших таблиц выполнение NOT NULL может занимать значительное время. Рекомендуется сначала добавить столбец с NULL, заполнить данные пакетно, затем применить ALTER COLUMN … SET NOT NULL для минимизации блокировок.
Установка значения по умолчанию для нового столбца

Значение по умолчанию назначается при добавлении столбца через DEFAULT. Оно автоматически присваивается всем существующим строкам и новым записям, если явно не указано другое значение.
Пример добавления столбца с числовым значением по умолчанию:
ALTER TABLE orders ADD COLUMN quantity INTEGER DEFAULT 1;
Для временных меток можно использовать системные функции:
ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
Если требуется сохранить значение по умолчанию только для новых записей, после заполнения существующих строк можно удалить DEFAULT:
ALTER TABLE orders ALTER COLUMN quantity DROP DEFAULT;
Рекомендуется явно задавать значение по умолчанию при добавлении столбца с ограничением NOT NULL, чтобы избежать ошибок вставки данных в существующие строки.
Добавление нескольких столбцов за одну команду
PostgreSQL позволяет добавлять несколько столбцов одной командой ALTER TABLE, разделяя определения запятыми. Это уменьшает количество блокировок и ускоряет изменение структуры таблицы.
Пример добавления двух столбцов:
ALTER TABLE users ADD COLUMN phone VARCHAR(20), ADD COLUMN status BOOLEAN DEFAULT TRUE;
Сравнение подходов:
| Метод | Описание | Преимущество |
|---|---|---|
| Отдельные команды | Добавление каждого столбца отдельным ALTER TABLE | Простота, но больше блокировок и времени на выполнение |
| Одна команда с несколькими столбцами | Добавление нескольких столбцов через запятую | Сокращает время блокировки, меньше операций записи в журнал |
При добавлении нескольких столбцов рекомендуется указывать тип данных и значения по умолчанию для столбцов с ограничением NOT NULL, чтобы избежать ошибок вставки в существующие строки.
Изменение существующего столбца после добавления
После добавления столбца его свойства можно изменить с помощью команды ALTER TABLE ALTER COLUMN. Изменения включают тип данных, значение по умолчанию и ограничение NOT NULL.
Для изменения типа данных используют ALTER COLUMN … TYPE. Пример:
ALTER TABLE users ALTER COLUMN age TYPE BIGINT;
Для установки или удаления значения по умолчанию применяют:
ALTER TABLE users ALTER COLUMN status SET DEFAULT TRUE;
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
Чтобы добавить ограничение NOT NULL к существующему столбцу:
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
Если таблица содержит данные, перед применением SET NOT NULL необходимо убедиться, что ни одна строка не содержит NULL, иначе команда завершится ошибкой.
Добавление столбца в таблицу с большим объёмом данных

При добавлении столбца в таблицу с миллионами строк важно минимизировать блокировки. Прямое добавление столбца с NOT NULL и DEFAULT может занять значительное время.
Рекомендуемый подход:
- Сначала добавить столбец с разрешением NULL: ALTER TABLE users ADD COLUMN age INTEGER;
- Заполнить значения пакетно с помощью UPDATE: UPDATE users SET age = 30 WHERE age IS NULL;
- Применить ограничение NOT NULL, когда все строки заполнены: ALTER TABLE users ALTER COLUMN age SET NOT NULL;
Если нужен DEFAULT для новых записей, его можно установить после заполнения существующих строк:
ALTER TABLE users ALTER COLUMN age SET DEFAULT 30;
Такой метод снижает нагрузку на журнал транзакций и ускоряет выполнение команды на больших таблицах.
Проверка успешного добавления столбца и структуры таблицы
После добавления столбца важно убедиться, что он появился в таблице и соответствует заданным параметрам.
Основные способы проверки:
- Просмотр структуры таблицы с помощью команды \d имя_таблицы в psql.
- Использование SELECT для проверки наличия нового столбца: SELECT column_name, data_type FROM information_schema.columns WHERE table_name = ‘users’;
- Проверка значений по умолчанию и ограничений через information_schema.columns и pg_catalog.pg_constraint.
Пример запроса для проверки столбца с NOT NULL и DEFAULT:
SELECT column_name, is_nullable, column_default FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'age';
Рекомендуется после добавления нового столбца вставить тестовую строку и выполнить SELECT, чтобы убедиться, что значения по умолчанию и ограничения работают корректно.
Вопрос-ответ:
Можно ли добавить столбец с ограничением NOT NULL в таблицу, которая уже содержит данные?
Да, но в этом случае необходимо указать значение по умолчанию через DEFAULT, иначе команда завершится ошибкой. Сначала столбец можно добавить с NULL, заполнить данные для всех строк, а затем применить SET NOT NULL.
Как добавить несколько столбцов за одну команду в PostgreSQL?
Используется команда ALTER TABLE с перечислением столбцов через запятую. Например: ALTER TABLE users ADD COLUMN phone VARCHAR(20), ADD COLUMN status BOOLEAN DEFAULT TRUE;. Это сокращает количество блокировок и уменьшает нагрузку на журнал транзакций.
Какие типы данных лучше выбрать для нового столбца с текстовой информацией?
Для ограниченных строк используют VARCHAR(n), где n — максимальная длина. Для длинных текстов или когда точная длина неизвестна, применяют TEXT. Это позволяет хранить произвольные строки без необходимости менять тип данных в будущем.
Как проверить, что столбец был добавлен корректно?
Проверку можно провести через psql командой \d имя_таблицы для отображения структуры, а также с помощью запроса к information_schema.columns: SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = ‘users’;. Также рекомендуется вставить тестовую строку, чтобы убедиться, что значения по умолчанию и ограничения работают.
Какие действия следует предпринять при добавлении столбца в таблицу с большим объёмом данных?
Лучше добавить столбец с разрешением NULL, затем заполнить данные пакетами с помощью UPDATE. После заполнения всех строк можно установить NOT NULL и значение по умолчанию, если требуется. Такой подход минимизирует время блокировок и нагрузку на журнал транзакций.
Можно ли добавить столбец с ограничением NOT NULL без значения по умолчанию в существующую таблицу?
Нет. Если таблица уже содержит данные, PostgreSQL не позволит добавить столбец с ограничением NOT NULL без указания значения по умолчанию. Правильная последовательность действий: сначала добавить столбец с разрешением NULL, заполнить существующие строки нужными значениями с помощью UPDATE, а затем применить ALTER COLUMN … SET NOT NULL.
Как проверить тип данных и наличие ограничения у нового столбца?
Для проверки структуры таблицы можно использовать команду \d имя_таблицы в psql, которая покажет все столбцы, их типы и ограничения. Также можно выполнить запрос к information_schema.columns: SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name = ‘users’;. Это позволяет убедиться, что столбец создан с нужными параметрами и значениями по умолчанию.
