如何更改SQLite表中列的类型?
我有:
CREATE TABLE table( id INTEGER, salt TEXT NOT NULL UNIQUE, step INT, insert_date TIMESTAMP );
我想将salt
's类型改为just TEXT
和id的类型为INTEGER PRIMARY KEY.
以下是讨论ALTER TABLE命令的SQLite手册的摘录(参见URL:SQLite Alter Table):
SQLite支持ALTER TABLE的有限子集.SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列.无法重命名列,删除列,或从表中添加或删除约束.
如手册所述,无法修改列的类型或约束,例如将NULL转换为NOT NULL.但是,有一个工作
将旧表复制到临时表,
创建一个根据需要定义的新表,和
将数据从临时表复制到新表.
为了给予信用到期的信用,我从bitbucket.org上关于hakanw的django-email-usernames项目的问题#1的讨论中学到了这一点.
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,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英寸Unibody MacBook和Mac OS X 10.5.7上运行.