如何在SQLITE中删除或添加列?
如何在SQLITE中删除或添加列?
问题的出现的原因:
要删除或添加列,需要对表进行修改,但是在SQLite中,没有直接的方法来实现这一点。因此,需要使用一些技巧和方法来实现这个功能。
解决方法:
下面是一个Java实现的例子,基于Sqlite的推荐方式来实现删除列的功能。
首先,我们需要获取表的列信息,可以使用"PRAGMA table_info"来实现。下面是获取表列的代码:
public ListgetTableColumns(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 { ListupdatedTableColumns = 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中删除或添加列,需要使用一些技巧和方法。可以通过获取表的列信息,删除不需要的列,创建新表,并将原表中的数据插入到新表中来实现。在操作过程中需要注意事务的使用和外键约束的处理。
如何在SQLite中删除或添加列?
问题的原因是SQLite 3.35.0版本引入了对ALTER TABLE DROP COLUMN的支持。DROP COLUMN语法用于从表中删除现有列。DROP COLUMN命令会从表中删除指定的列,并且还会重写整个表以清除与该列关联的数据。只有在该列没有被模式的任何其他部分引用、不是主键且没有唯一约束时,DROP COLUMN命令才能生效。
解决方法是使用以下语法:
ALTER TABLE
ALTER TABLE
然而,问题是什么时候在Android中接受这个语法?
截至今天,最高版本是3.32.2。我不知道它何时会升级。
您可以在此处查找Android API级别使用的Sqlite版本:developer.android.com/reference/android/database/sqlite/package-summary
根据文档中提到的SQLite版本,我们无法在Android设备上使用这个语法!
如何在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也是一个好主意,以确保您的外键在数据库的新结构中仍然一致。