ALTER TABLE: изменение схемы

Меняем структуру уже созданной таблицы командой ALTER TABLE.

ALTER TABLE изменяет схему существующей таблицы: добавляет столбцы, переименовывает таблицу или столбец, удаляет столбец.

Добавление столбца

Данные со временем меняются, и таблице может понадобиться новый столбец. ALTER TABLE ... ADD COLUMN добавляет его ко всем существующим строкам. Если задать DEFAULT, у старых строк столбец заполнится этим значением.

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);

INSERT INTO users (name) VALUES ('Аня'), ('Борис');

ALTER TABLE users ADD COLUMN city TEXT DEFAULT 'не указан';

SELECT id, name, city FROM users;

Вывод:

1|Аня|не указан
2|Борис|не указан

У обеих строк появился столбец city со значением по умолчанию.

Переименование

SQLite умеет переименовывать и таблицу целиком, и отдельный столбец:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);

INSERT INTO users (name) VALUES ('Аня');

-- переименуем столбец name в full_name
ALTER TABLE users RENAME COLUMN name TO full_name;

SELECT id, full_name FROM users;

Вывод:

1|Аня

А переименовать таблицу можно так: ALTER TABLE users RENAME TO accounts;.

Удаление столбца

Начиная с SQLite 3.35 (2021 год) поддерживается удаление столбца:

CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, temp TEXT);

INSERT INTO users (name, temp) VALUES ('Аня', 'мусор');

ALTER TABLE users DROP COLUMN temp;

SELECT * FROM users;

Вывод:

1|Аня

Чего ALTER TABLE в SQLite не умеет

В отличие от «больших» СУБД, ALTER TABLE в SQLite ограничен. Нельзя одной командой изменить тип столбца, добавить или убрать ограничение (например, навесить CHECK или сделать столбец NOT NULL задним числом). Если такое нужно, применяют классический приём:

  1. создать новую таблицу с правильной схемой;
  2. скопировать данные через INSERT INTO new SELECT ... FROM old;
  3. удалить старую таблицу (DROP TABLE old);
  4. переименовать новую в старое имя (ALTER TABLE new RENAME TO old).

Это звучит громоздко, но операция типовая, и для одного приложения с локальной базой выполняется мгновенно.

Итог

  • ADD COLUMN добавляет столбец; DEFAULT заполняет его у старых строк.
  • RENAME TO переименовывает таблицу, RENAME COLUMN ... TO — столбец; DROP COLUMN удаляет столбец.
  • Сменить тип или ограничение напрямую нельзя — пересоздают таблицу и копируют данные.
Проверьте себя
1. Что делает ALTER TABLE users ADD COLUMN city TEXT DEFAULT 'не указан'?
AУдаляет столбец city
BДобавляет столбец city, заполняя у старых строк значение по умолчанию
CПереименовывает таблицу
DМеняет тип столбца name
2. Чего НЕ умеет ALTER TABLE в SQLite одной командой?
AДобавить столбец
BПереименовать таблицу
CИзменить тип столбца или навесить ограничение задним числом
DУдалить столбец
3. Как в SQLite изменить столбец, если ALTER TABLE этого не позволяет?
AНикак, это невозможно
BСоздать новую таблицу, скопировать данные, удалить старую и переименовать новую
CИспользовать DROP DATABASE
DОтредактировать файл базы вручную
Поддержать проект