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 задним числом). Если такое нужно, применяют классический приём:
- создать новую таблицу с правильной схемой;
- скопировать данные через
INSERT INTO new SELECT ... FROM old; - удалить старую таблицу (
DROP TABLE old); - переименовать новую в старое имя (
ALTER TABLE new RENAME TO old).
Это звучит громоздко, но операция типовая, и для одного приложения с локальной базой выполняется мгновенно.
Итог
ADD COLUMNдобавляет столбец;DEFAULTзаполняет его у старых строк.RENAME TOпереименовывает таблицу,RENAME COLUMN ... TO— столбец;DROP COLUMNудаляет столбец.- Сменить тип или ограничение напрямую нельзя — пересоздают таблицу и копируют данные.