Как добавить столбец в таблицу — ALTER TABLE
ALTER TABLE products ADD COLUMN weight INTEGER;Команда одинакова в SQLite, MySQL и PostgreSQL. Новый столбец встаёт в конец таблицы, а в уже существующих строках в нём NULL. В MySQL слово COLUMN можно не писать.
Со значением по умолчанию
Чтобы старые строки сразу получили значение, задайте DEFAULT:
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 умеет ставить столбец не только в конец:
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;.
Переименовать и удалить столбец
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 удаляет столбец вместе со всеми его значениями во всех строках. Вернуть их можно только из резервной копии (как её сделать). Перед удалением проверьте, что столбец не нужен программам, которые работают с базой.
Изменить тип столбца
| СУБД | Команда |
|---|---|
| MySQL | ALTER TABLE products MODIFY COLUMN price DECIMAL(10,2) NOT NULL; |
| PostgreSQL | ALTER 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» само.
Проверить результат
| СУБД | Команда |
|---|---|
| SQLite | PRAGMA table_info(products); или .schema products в sqlite3 |
| MySQL | DESCRIBE products; |
| PostgreSQL | \d products в psql |
На больших таблицах MySQL и PostgreSQL изменение столбца может идти долго и блокировать таблицу. На рабочей базе такие команды выполняют в часы, когда нагрузка меньше.