当前位置:  开发笔记 > 前端 > 正文

如何在SQLITE中删除或添加列?

如何解决《如何在SQLITE中删除或添加列?》经验,为你挑选了4个好方法。

我想在sqlite数据库中删除或添加列

我正在使用以下查询来删除列.

ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME

但它给出了错误

System.Data.SQLite.SQLiteException: SQLite error
near "DROP": syntax error

Michał Powag.. 331

ALTER TABLE SQLite

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

您可以:

    创建新表作为您要更改的表,

    复制所有数据,

    放下旧桌子,

    重命名新的.

http://stackoverflow.com/a/5987838/1578528给出了执行任务的基本示例. (44认同)

在执行此序列之前,如果有外部表引用此表,则必须调用`PRAGMA foreign_keys = OFF`.在这种情况下,在执行此序列之后,必须调用`PRAGMA foreign_keys = ON`以重新启用外键. (3认同)


Udinic.. 45

我已经编写了一个基于Sqlite推荐方法的Java实现:

private void dropColumn(SQLiteDatabase db,
        ConnectionSource connectionSource,
        String createTableCmd,
        String tableName,
        String[] colsToRemove) throws java.sql.SQLException {

    List updatedTableColumns = getTableColumns(tableName);
    // Remove the columns we don't want anymore from the table's list of columns
    updatedTableColumns.removeAll(Arrays.asList(colsToRemove));

    String columnsSeperated = TextUtils.join(",", updatedTableColumns);

    db.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tableName + "_old;");

    // Creating the table on its new format (no redundant columns)
    db.execSQL(createTableCmd);

    // Populating the table with the data
    db.execSQL("INSERT INTO " + tableName + "(" + columnsSeperated + ") SELECT "
            + columnsSeperated + " FROM " + tableName + "_old;");
    db.execSQL("DROP TABLE " + tableName + "_old;");
}

要获取表的列,我使用了"PRAGMA table_info":

public List getTableColumns(String tableName) {
    ArrayList columns = new ArrayList();
    String cmd = "pragma table_info(" + tableName + ");";
    Cursor cur = getDB().rawQuery(cmd, null);

    while (cur.moveToNext()) {
        columns.add(cur.getString(cur.getColumnIndex("name")));
    }
    cur.close();

    return columns;
}

我实际上在我的博客上写过它,你可以在那里看到更多的解释:

http://udinic.wordpress.com/2012/05/09/sqlite-drop-column-support/



1> Michał Powag..:

ALTER TABLE SQLite

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

您可以:

    创建新表作为您要更改的表,

    复制所有数据,

    放下旧桌子,

    重命名新的.


http://stackoverflow.com/a/5987838/1578528给出了执行任务的基本示例.
在执行此序列之前,如果有外部表引用此表,则必须调用`PRAGMA foreign_keys = OFF`.在这种情况下,在执行此序列之后,必须调用`PRAGMA foreign_keys = ON`以重新启用外键.

2> Udinic..:

我已经编写了一个基于Sqlite推荐方法的Java实现:

private void dropColumn(SQLiteDatabase db,
        ConnectionSource connectionSource,
        String createTableCmd,
        String tableName,
        String[] colsToRemove) throws java.sql.SQLException {

    List updatedTableColumns = getTableColumns(tableName);
    // Remove the columns we don't want anymore from the table's list of columns
    updatedTableColumns.removeAll(Arrays.asList(colsToRemove));

    String columnsSeperated = TextUtils.join(",", updatedTableColumns);

    db.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tableName + "_old;");

    // Creating the table on its new format (no redundant columns)
    db.execSQL(createTableCmd);

    // Populating the table with the data
    db.execSQL("INSERT INTO " + tableName + "(" + columnsSeperated + ") SELECT "
            + columnsSeperated + " FROM " + tableName + "_old;");
    db.execSQL("DROP TABLE " + tableName + "_old;");
}

要获取表的列,我使用了"PRAGMA table_info":

public List getTableColumns(String tableName) {
    ArrayList columns = new ArrayList();
    String cmd = "pragma table_info(" + tableName + ");";
    Cursor cur = getDB().rawQuery(cmd, null);

    while (cur.moveToNext()) {
        columns.add(cur.getString(cur.getColumnIndex("name")));
    }
    cur.close();

    return columns;
}

我实际上在我的博客上写过它,你可以在那里看到更多的解释:

http://udinic.wordpress.com/2012/05/09/sqlite-drop-column-support/


我很确定如果您使用此解决方案,结果表上的列将完全裸露 - 不会保留类型信息,PK,FK,默认值,唯一或检查约束.导入到新表的所有内容都是列名.此外,由于它在运行之前不会禁用外键,因此其他表中的数据也会被搞砸.
或者,您也可以通过执行`"CREAT TABLE"+ tableName +"AS SELECT"+ columnsSeperated +"FROM"+ tableName +"_ old;"来创建新表,而不是执行`INSERT`语句.
如果这是在单个事务中完成的,而不是可能允许其他代码看到处于过渡状态的事情,那会更好.

3> Tasdik Rahma..:

正如其他人所指出的那样

无法重命名列,删除列,或从表中添加或删除约束.

来源:http://www.sqlite.org/lang_altertable.html

虽然您可以随时创建一个新表,然后删除旧表.我将尝试用一个例子来解释这个解决方法.

sqlite> .schema
CREATE TABLE person(
 id INTEGER PRIMARY KEY, 
 first_name TEXT,
 last_name TEXT, 
 age INTEGER, 
 height INTEGER
);
sqlite> select * from person ; 
id          first_name  last_name   age         height    
----------  ----------  ----------  ----------  ----------
0           john        doe         20          170       
1           foo         bar         25          171       

现在您要height从此表中删除该列.

创建另一个名为的表 new_person

sqlite> CREATE TABLE new_person(
   ...>  id INTEGER PRIMARY KEY, 
   ...>  first_name TEXT, 
   ...>  last_name TEXT, 
   ...>  age INTEGER 
   ...> ) ; 
sqlite> 

现在复制旧表中的数据

sqlite> INSERT INTO new_person
   ...> SELECT id, first_name, last_name, age FROM person ;
sqlite> select * from new_person ;
id          first_name  last_name   age       
----------  ----------  ----------  ----------
0           john        doe         20        
1           foo         bar         25        
sqlite>

现在删除person表并重命名new_personperson

sqlite> DROP TABLE IF EXISTS person ; 
sqlite> ALTER TABLE new_person RENAME TO person ;
sqlite>

所以现在如果你做了.schema,你会看到

sqlite>.schema
CREATE TABLE "person"(
 id INTEGER PRIMARY KEY, 
 first_name TEXT, 
 last_name TEXT, 
 age INTEGER 
);


我可以说你是一个真正的程序员.约翰·多伊之后你的名字用完了,直奔"foo bar":)

4> LeleDumbo..:

http://www.sqlite.org/lang_altertable.html

如图所示,仅支持ADD COLUMN.但是有一种(有点重)解决方法:http://www.sqlite.org/faq.html#q11

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有