Ниже приведена выдержка из руководства по SQLite, в котором обсуждается команда ALTER TABLE (см. URL: Таблица изменения SQLite ):
SQLite поддерживает ограниченное подмножество
ALTER TABLE. Команда ALTER TABLE
в SQLite позволяет пользователю переименовать
таблица или добавить новый столбец в
существующая таблица. Не возможно
переименовать столбец, удалить столбец или
добавить или удалить ограничения из
таблица.
Как указано в руководстве, невозможно изменить тип столбца или ограничения, такие как преобразование NULL в NOT NULL. Тем не менее, есть обходной путь
- копирование старой таблицы во временную таблицу,
- создание новой таблицы, определенной как желаемой, и
- копирование данных из временной таблицы в новую таблицу.
Чтобы отдать должное, когда это необходимо, я узнал об этом из дискуссии по проблеме № 1 проекта django-email-usernames hakanw на bitbucket.org.
CREATE TABLE test_table(
id INTEGER,
salt TEXT NOT NULL UNIQUE,
step INT,
insert_date TIMESTAMP
);
ALTER TABLE test_table RENAME TO test_table_temp;
CREATE TABLE test_table(
id INTEGER PRIMARY KEY,
salt TEXT,
step INT,
insert_date TIMESTAMP
);
INSERT INTO test_table SELECT * FROM test_table_temp;
DROP TABLE test_table_temp;
Примечания
- Я использовал имя таблицы
test_table
, поскольку SQLite выдаст ошибку, если вы попытаетесь назвать таблицу как table
.
- Команда
INSERT INTO
не будет выполнена, если ваши данные не соответствуют ограничениям новой таблицы. Например, если исходный test_table
содержит два поля id
с одинаковым целым числом, вы получите «SQL error: PRIMARY KEY must be unique
» при выполнении команды «INSERT INTO test_table SELECT * FROM test_table_temp;
».
- Для всего тестирования я использовал SQLite версии 3.4.0, входящий в состав Python 2.6.2, на моем 13-дюймовом MacBook Unibody с Mac OS X 10.5.7.