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

Ale*_*lex 13 sql sqlite types

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

我有:

    CREATE TABLE table(
        id INTEGER,
        salt TEXT NOT NULL UNIQUE,
        step INT,
        insert_date TIMESTAMP
    );
Run Code Online (Sandbox Code Playgroud)

我想将salt's类型改为just TEXT和id的类型为INTEGER PRIMARY KEY.

Mat*_*kin 27

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

SQLite支持ALTER TABLE的有限子集.SQLite中的ALTER TABLE命令允许用户重命名表或向现有表添加新列.无法重命名列,删除列,或从表中添加或删除约束.

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

  1. 将旧表复制到临时表,
  2. 创建一个根据需要定义的新表,和
  3. 将数据从临时表复制到新表.

为了给予信用到期的信用,我从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;
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 我使用了表名,test_table因为如果您尝试将表命名为SQLite,SQLite将生成错误table.
  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上运行.

  • 如果存在引用已删除表的索引会发生什么?它必须重新创建,对吧? (2认同)

The*_*iot 0

在这种情况下,您可以将salt设为可为并删除唯一约束。另外,如果id列不包含任何空值或重复值,您可以使用 SQL Server Management Studio 安全地将其设为主键。下面是屏幕截图。希望它更清楚: 替代文本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)
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是关于sqlite的,而不是关于sql server的,不幸的是,上面的`alter table`语法不被SQLite支持。 (3认同)