← Назад к вопросам

Какие знаешь команды для изменения таблицы в SQL?

1.0 Junior🔥 211 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь команды для изменения таблицы в SQL

Eтот вопрос касается команды ALTER TABLE в SQL, которая позволяет модифицировать существующие таблицы. Давайте разберём все основные операции.

Основная структура ALTER TABLE

ALTER TABLE table_name
ACTION;

1. Добавление столбца (ADD COLUMN)

-- Добавить один столбец
ALTER TABLE users
ADD COLUMN age INT;

-- Добавить несколько столбцов
ALTER TABLE users
ADD COLUMN age INT,
ADD COLUMN email VARCHAR(100),
ADD COLUMN is_active BOOLEAN DEFAULT true;

-- С ограничениями
ALTER TABLE users
ADD COLUMN user_id BIGINT NOT NULL UNIQUE,
ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

2. Удаление столбца (DROP COLUMN)

-- Удалить столбец
ALTER TABLE users
DROP COLUMN age;

-- Удалить несколько
ALTER TABLE users
DROP COLUMN age,
DROP COLUMN phone;

-- С проверкой существования
ALTER TABLE users
DROP COLUMN IF EXISTS age;

-- Каскадное удаление (если на столбец есть зависимости)
ALTER TABLE users
DROP COLUMN age CASCADE;

3. Изменение типа столбца (MODIFY/ALTER COLUMN)

-- PostgreSQL синтаксис
ALTER TABLE users
ALTER COLUMN age TYPE BIGINT;

-- MySQL синтаксис
ALTER TABLE users
MODIFY COLUMN age BIGINT;

-- SQL Server синтаксис
ALTER TABLE users
ALTER COLUMN age BIGINT;

-- С конвертацией данных
ALTER TABLE users
ALTER COLUMN created_at TYPE TIMESTAMP WITH TIME ZONE
USING created_at AT TIME ZONE 'UTC';

4. Переименование столбца (RENAME COLUMN)

-- PostgreSQL
ALTER TABLE users
RENAME COLUMN user_id TO id;

-- MySQL
ALTER TABLE users
CHANGE COLUMN user_id id BIGINT;

-- SQL Server
EXEC sp_rename 'users.user_id', 'id';

5. Изменение значения по умолчанию (ALTER COLUMN DEFAULT)

-- Добавить значение по умолчанию
ALTER TABLE users
ALTER COLUMN is_active SET DEFAULT true;

-- Удалить значение по умолчанию
ALTER TABLE users
ALTER COLUMN is_active DROP DEFAULT;

-- MySQL
ALTER TABLE users
MODIFY COLUMN is_active BOOLEAN DEFAULT true;

6. Добавление ограничений (ADD CONSTRAINT)

-- Primary Key
ALTER TABLE users
ADD CONSTRAINT pk_users PRIMARY KEY (id);

-- Unique
ALTER TABLE users
ADD CONSTRAINT uk_email UNIQUE (email);

-- Foreign Key
ALTER TABLE orders
ADD CONSTRAINT fk_user_id
FOREIGN KEY (user_id) REFERENCES users(id);

-- Check constraint
ALTER TABLE users
ADD CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150);

-- Not Null (в PostgreSQL через ALTER COLUMN)
ALTER TABLE users
ALTER COLUMN email SET NOT NULL;

7. Удаление ограничений (DROP CONSTRAINT)

-- PostgreSQL
ALTER TABLE users
DROP CONSTRAINT pk_users;

ALTER TABLE orders
DROP CONSTRAINT fk_user_id;

-- MySQL
ALTER TABLE users
DROP PRIMARY KEY;

ALTER TABLE users
DROP FOREIGN KEY fk_user_id;

-- SQL Server
ALTER TABLE users
DROP CONSTRAINT pk_users;

8. Переименование таблицы (RENAME TABLE)

-- PostgreSQL
ALTER TABLE users
RENAME TO app_users;

-- MySQL
ALTER TABLE users RENAME TO app_users;
RENAME TABLE users TO app_users;

-- SQL Server
EXEC sp_rename 'users', 'app_users';

9. Добавление индексов (CREATE INDEX)

-- Обычно это CREATE INDEX, но часто используется с ALTER TABLE
CREATE INDEX idx_email ON users(email);

CREATE UNIQUE INDEX idx_username ON users(username);

CREATE INDEX idx_created ON users(created_at DESC);

-- Составной индекс
CREATE INDEX idx_user_order ON orders(user_id, created_at);

10. Удаление индексов

-- PostgreSQL
DROP INDEX idx_email;

-- MySQL
ALTER TABLE users DROP INDEX idx_email;
DROP INDEX idx_email ON users;

-- SQL Server
DROP INDEX users.idx_email;

11. Изменение порядка столбцов (MySQL)

-- MySQL: переместить столбец
ALTER TABLE users
MODIFY COLUMN age INT AFTER email;

ALTER TABLE users
MODIFY COLUMN id BIGINT FIRST;  -- в начало

12. Полный пример миграции

-- Начальная таблица
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

-- Миграция 1: добавить поля
ALTER TABLE users
ADD COLUMN age INT,
ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN is_active BOOLEAN DEFAULT true;

-- Миграция 2: добавить ограничения
ALTER TABLE users
ADD CONSTRAINT uk_email UNIQUE (email),
ADD CONSTRAINT chk_age CHECK (age >= 0);

-- Миграция 3: переименовать столбец
ALTER TABLE users
RENAME COLUMN user_id TO id;

-- Миграция 4: изменить тип
ALTER TABLE users
ALTER COLUMN id TYPE BIGINT;

-- Миграция 5: добавить индекс
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_created ON users(created_at);

-- Миграция 6: удалить столбец (если больше не нужен)
ALTER TABLE users
DROP COLUMN age;

13. Особенности разных БД

PostgreSQL:

ALTER TABLE users
ADD COLUMN address TEXT;

ALTER TABLE users
ALTER COLUMN email SET NOT NULL;

ALTER TABLE users
DROP COLUMN address;

MySQL:

ALTER TABLE users
ADD COLUMN address TEXT;

ALTER TABLE users
MODIFY COLUMN email VARCHAR(100) NOT NULL;

ALTER TABLE users
DROP COLUMN address;

SQL Server:

ALTER TABLE users
ADD address TEXT;

ALTER TABLE users
ALTER COLUMN email VARCHAR(100) NOT NULL;

ALTER TABLE users
DROP COLUMN address;

14. Осторожность при ALTER TABLE

-- ВАЖНО: ALTER TABLE может быть дорогостоящей операцией!

-- На большой таблице это может заблокировать доступ
ALTER TABLE huge_table (1 млн строк)
ADD COLUMN new_column INT;  -- может занять минуты или часы

-- Лучший подход: миграции Goose/Flyway
-- Версионировать все изменения
-- Всегда делать backup перед ALTER TABLE
-- На production использовать инструменты типа pt-online-schema-change

15. Использование в Java/миграции (Goose пример)

-- migrations/0001_create_users.sql
CREATE TABLE users (
    id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    email VARCHAR(100) NOT NULL UNIQUE,
    name VARCHAR(100),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- migrations/0002_add_age_column.sql
ALTER TABLE users
ADD COLUMN age INT;

ALTER TABLE users
ADD CONSTRAINT chk_age CHECK (age >= 0);

-- migrations/0003_add_indexes.sql
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_created_at ON users(created_at DESC);

-- migrations/0004_add_is_active.sql
ALTER TABLE users
ADD COLUMN is_active BOOLEAN DEFAULT true,
ADD COLUMN updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP;

Таблица команд ALTER TABLE

ОперацияСинтаксисПример
Добавить столбецADD COLUMNADD COLUMN age INT
Удалить столбецDROP COLUMNDROP COLUMN age
Изменить типALTER COLUMN TYPE / MODIFYMODIFY age BIGINT
Переименовать столбецRENAME COLUMNRENAME COLUMN id TO user_id
Добавить ограничениеADD CONSTRAINTADD CONSTRAINT pk PRIMARY KEY
Удалить ограничениеDROP CONSTRAINTDROP CONSTRAINT pk
Переименовать таблицуRENAME TABLERENAME TO new_name
Добавить индексCREATE INDEXCREATE INDEX idx_name ON ...
Удалить индексDROP INDEXDROP INDEX idx_name
Изменить defaultSET/DROP DEFAULTALTER COLUMN x SET DEFAULT 0
Изменить NOT NULLSET/DROP NOT NULLALTER COLUMN x SET NOT NULL

Вывод

ALTER TABLE — это мощный инструмент для модификации схемы БД. Основные операции:

  1. Добавление/удаление столбцов
  2. Изменение типов данных
  3. Добавление/удаление ограничений
  4. Индексирование
  5. Переименование

Всегда помни:

  • Миграции должны быть версионированы (Goose, Flyway)
  • ALTER TABLE на больших таблицах может быть медленным
  • Всегда делай backup перед миграциями
  • На production используй инструменты для online миграций