当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《更改SQLite列类型并添加PK约束》经验,为你挑选了1个好方法。

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

我有:

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

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



1> Matthew Rank..:

以下是讨论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上运行.


如果存在引用已删除表的索引会发生什么?它必须重新创建,对吧?
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有