如何在Android中从SQLite表中删除列?

25

我尝试使用以下方法删除列:

openDB.execSQL("ALTER TABLE favs" + " DROP COLUMN favsCount");

LogCat显示以下消息:

11-07 21:18:29.238: ERROR/Database(13952): 在准备'ALTER TABLE favs DROP COLUMN favsCount'时出错,错误为1 (near "DROP": syntax error),位于0x34e550处。

在Android上的SQLite中不能删除字段吗?

2个回答

48

抱歉,SQLite 不支持删除列(DROP COLUMN)

(11) 如何在 SQLite 中添加或删除现有表中的列。

SQLite 仅支持有限的 ALTER TABLE 操作,您可以使用它来将列添加到表的末尾或更改表的名称。[...]

例如,假设您有一个名为“t1”的表,具有列名“a”、“b”和“c”,您想从该表中删除列“c”。以下步骤说明了如何完成此操作:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
基本上,你需要使用“复制、删除表、创建新表、再复制回来”的技巧来移除一个列。

@Suragch 请检查文档中的 SQLiteOpenHelper.getWritableDatabase()(假设你当然在使用它)。顺便说一下,这段示例 SQL 是从 SQLite 文档中引用的。 - mu is too short
1
好的。我不知道你是否对此有任何个人的了解或经验。有时候新用户在不知道自己在说什么的情况下会留下随机警告。 - Suragch
2
如果您正在编写带有Room迁移,请注意database.execSQL一次仅适用于单个语句,即这将变为database.execSQL(CREATE TEMPORARY TABLE...)``database.execSQL(INSERT INTO...)等。 - FutureShocked
在创建t1_backup时,它会从哪里获取每个列的类型? - Usman Rana
@UsmanRana:(1)SQLite文档中的示例旨在演示该技术。(2)SQLite具有基于值的类型系统,而不是基于列的类型系统。列类型对于SQLite并不是真正需要的,但如果您有一个ORM想要知道表模式应该是什么,则需要它们;但约束、索引等是必需的,请参见(1)。 - mu is too short
显示剩余3条评论

5

由于mu过短,Sqlite不允许使用alter table命令删除列。您可以在此处查看alter语法定义


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接