Ответ 1
Ниже приведена выдержка из руководства SQLite, в котором обсуждается команда ALTER TABLE (см. URL: SQLite Alter Table):
SQLite поддерживает ограниченное подмножество ALTER TABLE. Команда ALTER TABLE в SQLite позволяет пользователю переименовывать таблицы или добавить новый столбец в существующая таблица. Невозможно переименовать colum, удалить столбец или добавлять или удалять ограничения из таблица.
Как указано в руководстве, невозможно изменить тип или ограничения столбца, такие как преобразование NULL в NOT NULL. Тем не менее, есть работа вокруг
- копирование старой таблицы во временную таблицу,
- создание новой таблицы, определенной по желанию, и
- копирование данных из временной таблицы в новую таблицу.
Чтобы дать кредит, когда кредит должен быть получен, я узнал об этом из обсуждения № 1 проекта hakanw django-email-usernames на 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 с Mac OS X 10.5.7.