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

21 浏览
0 Comments

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

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

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

ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME

但是它会报错

System.Data.SQLite.SQLiteException: SQLite错误
附近的“DROP”处有语法错误

0
0 Comments

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

问题的出现的原因:

要删除或添加列,需要对表进行修改,但是在SQLite中,没有直接的方法来实现这一点。因此,需要使用一些技巧和方法来实现这个功能。

解决方法:

下面是一个Java实现的例子,基于Sqlite的推荐方式来实现删除列的功能。

首先,我们需要获取表的列信息,可以使用"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;
}

然后,我们可以使用以下代码来删除列:

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;");
}

这段代码的功能是将要删除的列从表的列列表中移除,然后创建一个新的表,不包含这些列,并将原表中的数据插入到新表中。

此外,还有一些关于性能和事务的问题。对于大数据表来说,这种方法可能会比较慢。为了提高性能,可以将所有操作放在一个事务中执行。在升级数据库时,可以使用事务来执行这些命令,以保证数据的一致性。

此外,这段代码可能会导致一些问题。新表中的列可能只包含列名,不包含类型信息、主键、外键、默认值、唯一性约束等其他信息。另外,在运行这段代码之前,需要禁用外键约束,以免影响其他表中的数据。

另一个解决方法是,不使用INSERT语句,而是使用"CREATE TABLE tableName AS SELECT columnsSeperated FROM tableName_old;"来创建新表。

要在SQLite中删除或添加列,需要使用一些技巧和方法。可以通过获取表的列信息,删除不需要的列,创建新表,并将原表中的数据插入到新表中来实现。在操作过程中需要注意事务的使用和外键约束的处理。

0
0 Comments

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

问题的原因是SQLite 3.35.0版本引入了对ALTER TABLE DROP COLUMN的支持。DROP COLUMN语法用于从表中删除现有列。DROP COLUMN命令会从表中删除指定的列,并且还会重写整个表以清除与该列关联的数据。只有在该列没有被模式的任何其他部分引用、不是主键且没有唯一约束时,DROP COLUMN命令才能生效。

解决方法是使用以下语法:

ALTER TABLE DROP COLUMN ;

ALTER TABLE DROP ;

然而,问题是什么时候在Android中接受这个语法?

截至今天,最高版本是3.32.2。我不知道它何时会升级。

您可以在此处查找Android API级别使用的Sqlite版本:developer.android.com/reference/android/database/sqlite/package-summary

根据文档中提到的SQLite版本,我们无法在Android设备上使用这个语法!

0
0 Comments

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

出现的原因:

SQLite仅支持ALTER TABLE的有限子集。在SQLite中,ALTER TABLE命令允许用户重命名表或向现有表添加新列。不可能重命名列、删除列或从表中添加或删除约束。

解决方法:

您可以:

1. 创建一个与您尝试更改的表相同的新表,

2. 复制所有数据,

3. 删除旧表,

4. 重命名新表。

在执行此序列之前,并且在存在引用此表的外部表的情况下,必须调用PRAGMA foreign_keys=OFF。在这种情况下,在执行此序列后,必须调用PRAGMA foreign_keys=ON以重新启用外键。

如何同时复制外键和索引?

只要首先执行create new table而不是create from select,它将具有所有这些内容。

请更新您的文档链接,因为网站现在是https => sqlite.org/lang_altertable.html

在较新的SQLite版本中,支持RENAME COLUMN。

此答案已过时-现在支持ALTER TABLE tablename DROP COLUMN columnname。请参阅文档。

如Magnus W所评论的,较新的版本支持DROP COLUMN-请参阅此答案。

在模拟ALTER TABLE命令后,运行PRAGMA foreign_key_check也是一个好主意,以确保您的外键在数据库的新结构中仍然一致。

0