如何更改SQLite表中列的类型?
我有:
CREATE TABLE table(
id INTEGER,
salt TEXT NOT NULL UNIQUE,
step INT,
insert_date TIMESTAMP
);
我想将salt
的类型更改为TEXT
,将id的类型更改为INTEGER PRIMARY KEY。
答案 0 :(得分:27)
以下是讨论ALTER TABLE命令的SQLite手册的摘录(参见URL:SQLite Alter Table):
SQLite支持有限的子集 更改表。 ALTER TABLE命令 在SQLite中允许用户重命名 表或添加新列到 现有表格。这是不可能的 重命名列,删除列或 添加或删除a的约束 表
如手册所述,无法修改列的类型或约束,例如将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
,因为如果您尝试将表命名为table
,SQLite将生成错误。INSERT INTO
命令将失败。例如,如果原始test_table
包含两个具有相同整数的id
字段,则在执行“SQL error: PRIMARY KEY must be unique
”命令时将收到“INSERT INTO test_table SELECT * FROM test_table_temp;
”。答案 1 :(得分:1)
由于未指定RDBMS,因此这些是DB2查询:
将ID设为主键:
ALTER TABLE table
ADD CONSTRAINT pk_id
PRIMARY KEY (id)
使盐不是独一无二的:
ALTER TABLE table
DROP UNIQUE <salt-unique-constraint-name>
让盐可以为空:
ALTER TABLE table
ALTER COLUMN salt DROP NOT NULL
在drop not not null之后你需要做一次重组。这是从命令提示符完成的。
reorg table <tableName>
答案 2 :(得分:0)
在这种情况下,您可以将 salt 设置为 nullable 并删除唯一约束。此外,如果 id 列不包含任何null或重复值,您可以使用sql server management studio安全地将其设为主键。下面是屏幕截图。希望它更清楚: alt text http://img265.imageshack.us/img265/7418/91573473.png
或使用以下sql:
alter table <TableName> modify salt text null
alter table <TableName> drop constraint <Unique Constraint Name>
alter table <TableName> modify id int not null
alter table <TableName> add constraint pk<Table>d primary key (id)