Altering SQLite column type and adding PK constraint

前端 未结 3 1809
隐瞒了意图╮
隐瞒了意图╮ 2021-02-05 19:32

How to change the type of a column in a SQLite table?

I\'ve got:

    CREATE TABLE table(
        id INTEGER,
        salt TEXT NOT NULL UNIQUE,
        s         


        
3条回答
  •  旧时难觅i
    2021-02-05 19:53

    Below is an excerpt from the SQLite manual discussing the ALTER TABLE command (see URL: SQLite Alter Table):

    SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a colum, remove a column, or add or remove constraints from a table.

    As the manual states, it is not possible to modify a column's type or constraints, such as converting NULL to NOT NULL. However, there is a work around by

    1. copying the old table to a temporary table,
    2. creating a new table defined as desired, and
    3. copying the data from the temporary table to the new table.

    To give credit where credit is due, I learned this from the discussion on Issue #1 of hakanw's django-email-usernames project on bitbucket.org.

    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;
    

    Notes

    1. I used the table name test_table since SQLite will generate an error if you try to name a table as table.
    2. The INSERT INTO command will fail if your data does not conform to the new table constraints. For instance, if the original test_table contains two id fields with the same integer, you will receive an "SQL error: PRIMARY KEY must be unique" when you execute the "INSERT INTO test_table SELECT * FROM test_table_temp;" command.
    3. For all testing, I used SQLite version 3.4.0 as included as part of Python 2.6.2 running on my 13" Unibody MacBook with Mac OS X 10.5.7.

提交回复
热议问题