CodeRang
Темы SQL

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: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Проверьте ограничения таблицы employees

В базе есть таблицы departments и employees. У employees настроены первичный ключ, внешний ключ на departments, уникальность email и проверка неотрицательной зарплаты. Получите имя ограничения, его тип и колонку. Результат должен содержать constraint_name, constraint_type, column_name и быть отсортирован по имени ограничения.

Запрос 1PostgreSQLv16
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;
Отправить
Результатdepartmentsemployees
Ответ принят

Как работают 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.

SQLPostgreSQL v16
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_nameconstraint_typecolumn_name
employees_department_fkFOREIGN KEYdepartment_id
employees_email_keyUNIQUEemail
employees_pkeyPRIMARY KEYid
employees_salary_checkCHECKNULL

Ошибки при ALTER TABLE и CREATE TABLE

01

FOREIGN KEY без продуманного ON DELETE

Связь создаётся, но поведение при удалении родительской строки остаётся неосознанным. CASCADE может удалить связанные строки, RESTRICT — запретить удаление, SET NULL — обнулить ссылку, если колонка это допускает. Выбор должен следовать бизнес-правилу, а не привычке.

02

CHECK используют вместо NOT NULL

Условие CHECK не всегда означает, что NULL запрещён. Если поле обязательно, это нужно выражать отдельным NOT NULL, а CHECK оставлять для диапазона или другого правила над значением.

03

Проверяют только 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 связан с индексами и исполнением запросов.

Частые вопросы

Что такое 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