Изменение схемы таблицы стало актуальным с массовым распространением Agile-методологий. Проекты эволюционируют, требования меняются — со временем обязательно появляется необходимость добавлять/изменять/удалять столбцы. В рабочих продуктивных базах такие изменения особенно рискованны.
Модификация структуры может привести к:
Особенно сложны изменения в больших таблицах (миллионы строк), которые активно используются другими сервисами.
Грамотная работа через ALTER TABLE — поэтапные изменения, создание копии данных, тестирование на стенде, ограничение времени простоя. Использование транзакций, поэтапная миграция и резервное копирование перед крупными изменениями. В высоконагруженных СУБД часто пользуются "online"-алгоритмами ALTER.
Пример кода:
-- Добавление нового столбца с дефолтным значением ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'new'; -- Постепенное наполнение новых столбцов UPDATE orders SET status = CASE WHEN shipped_at IS NOT NULL THEN 'shipped' ELSE 'pending' END;
Ключевые особенности:
Выполняется ли ALTER TABLE атомарно?
Чаще всего нет: изменение таблицы может занять много времени. В случае сбоя часть изменений может откатиться, но часть — повиснуть. Поэтому транзакционную защиту на DDL-команды реализуют только некоторые СУБД (например, PostgreSQL).
Можно ли безболезненно менять тип столбца с INTEGER на VARCHAR?
Не всегда: если в столбце есть старые данные, не соответствующие новому формату, или связанные объекты (индексы, триггеры, ключи), СУБД может не дать изменить тип или данные будут повреждены.
ALTER TABLE всегда накладывает эксклюзивную блокировку на всю таблицу?
Зависит от СУБД: в MySQL и старых версиях SQL Server любая операция ALTER часто полностью блокирует таблицу до завершения, но современные СУБД поддерживают "online DDL", снижая время блокировки.
DevOps-инженер внес массовые изменения в три важные таблицы через ALTER TABLE и удалил старые столбцы. Не учёл, что к этим столбцам привязаны внешние ключи и триггеры. Во время работы ALTER база занималась 20 минут — за это время сервисы "упали" из-за отсутствия нужных полей.
Плюсы:
Минусы:
Аналитик спланировал добавление столбца в несколько этапов: вначале создали столбец с дефолтом, залили тестовую нагрузку на копии, только потом сделали реальный ALTER ночью и сообщили всем разработчикам о грядущем миграционном окне.
Плюсы:
Минусы: