ALTER TABLE: как изменить таблицу в SQL
ALTER TABLE используют, когда структуру уже существующей таблицы нужно изменить. Разберём добавление и изменение колонок, а также CREATE TABLE SQL для создания новой схемы.
Обновлено · Команда SQL Arena
Что потренируете
- Выбирать типы колонок и задавать PRIMARY KEY
- Связывать таблицы через FOREIGN KEY и понимать ON DELETE
- Использовать UNIQUE, CHECK, NOT NULL и DEFAULT
- Проверять ограничения через information_schema
- Менять готовую схему без лишних побочных эффектов
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
В базе есть таблицы departments и employees. У employees настроены первичный ключ, внешний ключ на departments, уникальность email и проверка неотрицательной зарплаты. Получите имя ограничения, его тип и колонку. Результат должен содержать constraint_name, constraint_type, column_name и быть отсортирован по имени ограничения.
SELECT tc.constraint_name, tc.constraint_type, kcu.column_name FROM information_schema.table_constraints AS tc LEFT JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.constraint_schema = kcu.constraint_schema WHERE tc.table_schema = 'public' AND tc.table_name = 'employees' AND tc.constraint_name NOT LIKE '%_not_null' ORDER BY tc.constraint_name;
| # | constraint_name | constraint_type | column_name |
|---|---|---|---|
| 1 | employees_department_fk | FOREIGN KEY | department_id |
| 2 | employees_email_key | UNIQUE | |
| 3 | employees_pkey | PRIMARY KEY | id |
| 4 | employees_salary_check | CHECK | NULL |
В базе есть таблицы departments и employees. У employees настроены первичный ключ, внешний ключ на departments, уникальность email и проверка неотрицательной зарплаты. Получите имя ограничения, его тип и колонку. Результат должен содержать constraint_name, constraint_type, column_name и быть отсортирован по имени ограничения.
SELECT tc.constraint_name, tc.constraint_type, kcu.column_name FROM information_schema.table_constraints AS tc LEFT JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.constraint_schema = kcu.constraint_schema WHERE tc.table_schema = 'public' AND tc.table_name = 'employees' AND tc.constraint_name NOT LIKE '%_not_null' ORDER BY tc.constraint_name;
Как работают ALTER TABLE и CREATE TABLE SQL
Сначала смотрим на саму схему. departments — родительская таблица: её id является PRIMARY KEY, поэтому каждое значение уникально и может быть целью внешней ссылки. У employees вторая колонка department_id ссылается на departments(id). ON DELETE RESTRICT запрещает удалить отдел, пока на него ссылаются сотрудники. Это не косметическая настройка: она задаёт поведение данных при удалении строки из родительской таблицы.
В employees есть несколько разных правил. PRIMARY KEY обеспечивает уникальный идентификатор строки. UNIQUE на email не даёт двум сотрудникам получить один и тот же адрес. CHECK (salary >= 0) отсекает отрицательные значения, NOT NULL запрещает отсутствие обязательных данных, а DEFAULT 0 задаёт значение зарплаты, если оно не указано при вставке. В реальной схеме эти ограничения дополняют друг друга, а не заменяют одно другое.
Проверочный SELECT обращается к information_schema.table_constraints и соединяет его с key_column_usage. Первый источник сообщает типы ограничений, второй — колонку, к которой относится ключевое ограничение. LEFT JOIN нужен потому, что CHECK может не иметь строки в key_column_usage: если использовать INNER JOIN, такое ограничение исчезнет из результата. Фильтр оставляет только employees в схеме public, а ORDER BY делает порядок строк стабильным.
Такой запрос полезен после CREATE TABLE или ALTER TABLE: он позволяет проверить не данные, а структуру базы. При проектировании таблиц SQL это отдельный навык. Важно не только написать DDL, но и убедиться, что имя ограничения, тип связи и ожидаемое правило действительно появились в схеме.
ALTER TABLE используют, когда таблица уже существует и её структуру нужно изменить. Через него можно добавить колонку с ADD COLUMN, изменить тип или свойства столбца, переименовать колонку или таблицу, добавить ограничение и удалить ненужный столбец. CREATE TABLE решает другую задачу: создаёт новую таблицу и сразу задаёт колонки, типы, PRIMARY KEY, FOREIGN KEY, UNIQUE и CHECK. Конкретный синтаксис некоторых операций ALTER TABLE отличается между СУБД, поэтому перед изменением схемы важно учитывать выбранный диалект SQL.
SELECT tc.constraint_name, tc.constraint_type, kcu.column_name FROM information_schema.table_constraints AS tc LEFT JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name AND tc.constraint_schema = kcu.constraint_schema WHERE tc.table_schema = 'public' AND tc.table_name = 'employees' AND tc.constraint_name NOT LIKE '%_not_null' ORDER BY tc.constraint_name;
| constraint_name | constraint_type | column_name |
|---|---|---|
| employees_department_fk | FOREIGN KEY | department_id |
| employees_email_key | UNIQUE | |
| employees_pkey | PRIMARY KEY | id |
| employees_salary_check | CHECK | NULL |
Ошибки при ALTER TABLE и CREATE TABLE
FOREIGN KEY без продуманного ON DELETE
Связь создаётся, но поведение при удалении родительской строки остаётся неосознанным. CASCADE может удалить связанные строки, RESTRICT — запретить удаление, SET NULL — обнулить ссылку, если колонка это допускает. Выбор должен следовать бизнес-правилу, а не привычке.
CHECK используют вместо NOT NULL
Условие CHECK не всегда означает, что NULL запрещён. Если поле обязательно, это нужно выражать отдельным NOT NULL, а CHECK оставлять для диапазона или другого правила над значением.
Проверяют только CREATE TABLE, но не итоговую схему
После нескольких ALTER TABLE легко потерять ограничение, имя или тип колонки. Запросы к information_schema помогают проверить фактическую структуру, а не то, что разработчик помнит о миграции.
Задачи по теме в тренажёре
Трек «SQL для Backend-разработчика»В SQL Arena есть отдельные задачи на DDL: удалить или переименовать колонку, создать индекс, изменить тип поля, собрать представление, добавить обязательный флаг с DEFAULT. Простые задачи доступны бесплатно, более сложные входят в Premium. Если тема нужна для backend-разработки системно, продолжите в треке «SQL для Backend-разработчика». В тренажёре 1 192 задачи; у каждой задачи свои таблицы. PostgreSQL, MySQL, ClickHouse и BigQuery запускаются в отдельных песочницах прямо в браузере. Решение проверяется на скрытых данных, поэтому недостаточно подогнать запрос под показанные строки. Для разбора схем доступны ER-диаграммы, а EXPLAIN пригодится в задачах, где DDL связан с индексами и исполнением запросов.
- EasyбесплатноУдалить столбец salary из employeespostgresqlmysql
- EasyбесплатноПереименовать столбец name в full_namepostgresqlmysql
- EasyбесплатноИндекс для поиска сотрудников по имениpostgresqlmysql
- EasyбесплатноПредставление активных сотрудниковpostgresqlmysql
- MediumPremiumУникальный индекс по имени сотрудникаpostgresqlmysql
- MediumPremiumИзменить тип salary на BIGINTpostgresql
- MediumPremiumПредставление сотрудников с названиями отделовpostgresqlmysql
- MediumPremiumДобавить обязательный флаг активности с дефолтомpostgresql
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Что такое ALTER TABLE?
ALTER TABLE — оператор SQL для изменения структуры существующей таблицы. С его помощью можно добавлять, удалять и переименовывать колонки, изменять некоторые их свойства и управлять ограничениями.
Как добавить колонку через ALTER TABLE?
Обычно используют ALTER TABLE с ADD COLUMN, после чего указывают имя новой колонки и её тип данных. Дополнительно можно задать DEFAULT, NOT NULL или другие поддерживаемые ограничения.
Как изменить колонку через ALTER TABLE?
Синтаксис зависит от СУБД и от того, что именно требуется изменить: тип, имя, значение по умолчанию или ограничение NULL. Поэтому ALTER TABLE для изменения колонки нужно писать с учётом конкретного SQL-диалекта.
Как работает CREATE TABLE SQL?
CREATE TABLE создаёт новую таблицу и описывает её структуру. В запросе задают названия колонок, типы данных и при необходимости PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT и другие ограничения.
Как создать таблицу SQL запросом?
Используйте CREATE TABLE, затем имя таблицы и список определений колонок в скобках. Каждой колонке задают имя и тип данных, а правила целостности можно указать рядом с колонками или отдельными ограничениями.
Практика ALTER TABLE и CREATE TABLE SQL
Начните с бесплатных Easy-задач на изменение схемы, а затем переходите к задачам на ограничения, индексы и более сложные миграции. Регистрация без карты; на бесплатном тарифе доступны 292 задачи на четырёх диалектах.
Практиковать DDL в SQL Arena