重命名列名时出现 SQLITE 语法错误代码 1

onl*_*ise 2 migration sqlite syntax android rename

我正在我的 Android 应用程序中迁移 Room 数据库。这是迁移代码:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE item RENAME itemInfoId TO itemId");
    }
};
Run Code Online (Sandbox Code Playgroud)

错误信息

android.database.sqlite.SQLiteException: near "itemInfoId": syntax error (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE item RENAME itemInfoId TO itemId
Run Code Online (Sandbox Code Playgroud)

我也试过 SQL "ALTER TABLE item RENAME COLUMN itemInfoId TO itemId",同样的错误

android.database.sqlite.SQLiteException: near "COLUMN": syntax error (code 1 SQLITE_ERROR): , while compiling: ALTER TABLE item RENAME COLUMN itemInfoId TO itemId
Run Code Online (Sandbox Code Playgroud)

Swa*_*jit 5

重命名关键字在 SQLite 3.25 版中可用,但不适用于最新的 android 版本。您将不得不手动升级表

1.使用正确的列值 itemId 创建 item_tmp 表

CREATE TABLE item_tmp(<column1> <data_type>, itemId <data_type>,.....)
Run Code Online (Sandbox Code Playgroud)

2.从item复制数据到item_tmp

INSERT INTO item(<column1>, <column2>,..) 
    SELECT <column1>, <column1>, ... 
    FROM item_tmp;
Run Code Online (Sandbox Code Playgroud)

3.删除表项

DROP TABLE item;
Run Code Online (Sandbox Code Playgroud)

4.重命名item_tmp表

ALTER TABLE item_tmp RENAME TO item;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此答案中的操作顺序在[文档](https://www.sqlite.org/lang_altertable.html)中明确指出为不正确。 (2认同)