Глиф Учебники

Как добавить столбец в таблицу — ALTER TABLE

Справочник · SQL · 2 минуты чтения

SQL
ALTER TABLE products ADD COLUMN weight INTEGER;

Команда одинакова в SQLite, MySQL и PostgreSQL. Новый столбец встаёт в конец таблицы, а в уже существующих строках в нём NULL. В MySQL слово COLUMN можно не писать.

Со значением по умолчанию

Чтобы старые строки сразу получили значение, задайте DEFAULT:

SQL
ALTER TABLE products ADD COLUMN in_stock INTEGER NOT NULL DEFAULT 1;

Во всех строках, старых и новых, in_stock будет 1, пока его не изменят. Столбец NOT NULL без DEFAULT в SQLite добавить нельзя — ошибка Cannot add a NOT NULL column with default value NULL: старым строкам нечего в него записать. PostgreSQL в таком случае выдаёт ошибку, если в таблице уже есть строки.

Ограничения SQLite

SQLite добавляет столбцы с оговорками:

Что не получитсяОшибка
UNIQUE или PRIMARY KEY у нового столбцаCannot add a UNIQUE column
DEFAULT CURRENT_TIMESTAMP и другие вычисляемые значенияCannot add a column with non-constant default
столбец с уже занятым именемduplicate column name: weight
несколько столбцов одной командойsyntax error — пишите по команде на столбец

Уникальность добавляют отдельно, индексом: CREATE UNIQUE INDEX idx_products_code ON products (code);.

MySQL: место столбца

MySQL умеет ставить столбец не только в конец:

SQL
ALTER TABLE products ADD COLUMN sku VARCHAR(20) AFTER name;
ALTER TABLE products ADD COLUMN code VARCHAR(20) FIRST;

Несколько столбцов в MySQL и PostgreSQL — через запятую в одной команде: ALTER TABLE products ADD COLUMN a INT, ADD COLUMN b INT;.

Переименовать и удалить столбец

SQL
ALTER TABLE products RENAME COLUMN weight TO weight_g;
ALTER TABLE products DROP COLUMN in_stock;

RENAME COLUMN есть в SQLite 3.25 и новее, MySQL 8.0 и новее и в PostgreSQL. DROP COLUMN в SQLite появился в версии 3.35; SQLite не удалит столбец, если он входит в индекс, ключ или ограничение.

DROP COLUMN удаляет столбец вместе со всеми его значениями во всех строках. Вернуть их можно только из резервной копии (как её сделать). Перед удалением проверьте, что столбец не нужен программам, которые работают с базой.

Изменить тип столбца

СУБДКоманда
MySQLALTER TABLE products MODIFY COLUMN price DECIMAL(10,2) NOT NULL;
PostgreSQLALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
SQLiteодной командой нельзя

В MySQL MODIFY задаёт столбец заново: укажите и NOT NULL, и DEFAULT, если они были, — иначе они пропадут.

В SQLite тип меняют пересборкой таблицы: создают новую таблицу с нужными столбцами, переносят данные через INSERT INTO новая (…) SELECT … FROM старая, удаляют старую и переименовывают новую. Делайте это внутри транзакции и после резервной копии. В DB Browser for SQLite это делает окно «Modify Table» само.

Проверить результат

СУБДКоманда
SQLitePRAGMA table_info(products); или .schema products в sqlite3
MySQLDESCRIBE products;
PostgreSQL\d products в psql

На больших таблицах MySQL и PostgreSQL изменение столбца может идти долго и блокировать таблицу. На рабочей базе такие команды выполняют в часы, когда нагрузка меньше.