更改SQLite列类型并添加PK约束

时间:2009-06-09 10:02:37

标签: sql sqlite types

如何更改SQLite表中列的类型?

我有:

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

我想将salt的类型更改为TEXT,将id的类型更改为INTEGER PRIMARY KEY。

3 个答案:

答案 0 :(得分:27)

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

  

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

如手册所述,无法修改列的类型或约束,例如将NULL转换为NOT NULL。但是,有一个工作

  1. 将旧表复制到临时表
  2. 创建一个根据需要定义的新表,
  3. 将数据从临时表复制到新表。
  4. 为了给予信用到期,我从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;
    

    备注

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

答案 1 :(得分: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
  4. 在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)