2009-06-09 42 views
13

如何更改SQLite表中列的类型?更改SQLite列类型并添加PK约束

我有:

CREATE TABLE table(
     id INTEGER, 
     salt TEXT NOT NULL UNIQUE, 
     step INT, 
     insert_date TIMESTAMP 
    ); 

我想改变salt的类型,只是TEXT和id的类型为INTEGER PRIMARY KEY。

+0

需要更多的信息,包括其他指标,约束,PK ...如果你使用MSSQL,那么请做“Script table as ...” - >“Create to” - >“New Query window”,然后粘贴这个脚本,然后有人会帮助你 – van 2009-06-09 10:22:59

回答

0

在这种情况下,您可以制作可为空并删除唯一约束。另外,如果ID列不包含任何空值或重复值,则可以使用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) 
+0

是的,但我认为他想知道怎么做。:) – 2009-06-09 10:08:59

+3

这个问题是关于sqlite的,而不是关于sql server,不幸的是上面的alter table语法不被SQLite支持, – Abel 2014-05-04 21:31:58

1

由于未指定的RDBMS,这些都是DB2查询:

  1. 制作ID作为主键:

    ALTER TABLE table 
        ADD CONSTRAINT pk_id 
        PRIMARY KEY (id)
  2. 使盐不独特:

    ALTER TABLE table 
        DROP UNIQUE <salt-unique-constraint-name>
  3. 使盐可空:

    ALTER TABLE table 
        ALTER COLUMN salt DROP NOT NULL

您将需要降不为空后做了一次reorg。这是通过命令提示符完成的。

reorg table <tableName> 
+2

我的答案在编辑问题之前发布,以指定使用的数据库。 – 2012-06-11 11:10:32

27

下面是从SQLite的手册讨论ALTER TABLE命令的摘录(参见URL:SQLite Alter Table):

SQLite支持 ALTER TABLE的有限子集。 SQLite中的ALTER TABLE命令 允许用户重命名 表或将新列添加到 现有表。不可能 重命名柱,删除列或 添加或删除 表中的约束。

正如手册所述,不可能修改列的类型或约束,例如将NULL转换为NOT NULL。然而,通过

  1. 复制旧表到一个临时表,
  2. 工作围绕创建定义所需的新表,并
  3. 从临时表中的数据复制到新表。

为了在信用到期时给予抵免,我从关于bitbucket.org的hakanw's 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; 

  1. 我使用的表名test_table因为SQLite的,如果你尝试命名表作为table会产生错误。
  2. 如果您的数据不符合新的表约束,INSERT INTO命令将失败。例如,如果原始test_table包含两个具有相同整数的id字段,则当您执行“INSERT INTO test_table SELECT * FROM test_table_temp;”命令时,将收到“SQL error: PRIMARY KEY must be unique”。
  3. 对于所有的测试中,我使用的SQLite版本3.4.0为包含的Python 2.6.2的一部分上运行我的13" 一体成型MacBook和Mac OS X 10.5.7。