ALTER TABLE и нормализация
Меняем структуру готовых таблиц и понимаем, зачем данные разбивают на несколько таблиц.
ALTER TABLE — команда, изменяющая структуру существующей таблицы: добавляет, удаляет и меняет столбцы и ограничения без пересоздания таблицы.
Изменение структуры на лету
Схема почти никогда не бывает идеальной с первого раза. Требования меняются, появляются новые поля. ALTER TABLE позволяет дорабатывать таблицу, не теряя данные.
-- Добавить столбец
ALTER TABLE users ADD COLUMN phone TEXT;
-- Удалить столбец
ALTER TABLE users DROP COLUMN phone;
-- Переименовать столбец
ALTER TABLE users RENAME COLUMN name TO full_name;
-- Сменить тип столбца
ALTER TABLE users ALTER COLUMN age TYPE BIGINT;
-- Задать и снять значение по умолчанию
ALTER TABLE users ALTER COLUMN active SET DEFAULT true;
ALTER TABLE users ALTER COLUMN active DROP DEFAULT;
Добавление и снятие ограничений
Ограничения тоже можно добавлять к уже существующей таблице. Это частая операция при ужесточении требований к данным.
-- Добавить ограничение
ALTER TABLE users ADD CONSTRAINT uq_email UNIQUE (email);
ALTER TABLE orders ADD CONSTRAINT positive_total CHECK (total >= 0);
-- Сделать столбец обязательным
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
-- Снять ограничение по имени
ALTER TABLE users DROP CONSTRAINT uq_email;
Важно: если добавляете NOT NULL или CHECK к таблице, где уже есть данные, PostgreSQL проверит все строки. Если хоть одна нарушает правило — команда не выполнится. Сначала почистите данные.
Зачем нужна нормализация
Нормализация — это процесс разбиения данных на таблицы так, чтобы каждый факт хранился ровно в одном месте. Посмотрим на проблему «всё в одной таблице».
| order_id | customer | customer_city | product |
| 1 | Анна | Москва | Кофе |
| 2 | Анна | Москва | Чай |
Город Анны записан дважды. Если она переедет, придётся обновлять каждую строку — и легко что-то пропустить (это называют аномалией обновления). Решение — вынести клиентов в отдельную таблицу и связать внешним ключом.
Нормализованная схема
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
city TEXT
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id),
product TEXT NOT NULL
);
Теперь город Анны хранится в одной строке таблицы customers. Переезд — это одно обновление. Заказы ссылаются на клиента по customer_id. Это и есть суть нормализации: каждый факт — в одном месте.
Практический баланс: нормализация убирает дублирование и аномалии, но добавляет JOIN-ы при выборке. Иногда ради скорости чтения данные сознательно денормализуют — но начинать всегда стоит с нормализованной схемы.
Итог
ALTER TABLEменяет структуру без потери данных: столбцы, типы, значения по умолчанию, ограничения.- Добавление
NOT NULL/CHECKк непустой таблице проверяет существующие строки и упадёт при нарушении. - Нормализация хранит каждый факт в одном месте, убирая дублирование и аномалии обновления.