当我将应用程序的数据库从一个版本升级到另一个版本时,我执行以下命令:
db.execSQL("ALTER TABLE tags_vocab RENAME TO tmp_tags_vocab");
db.execSQL("DROP INDEX idx_tags_vocab");
db.execSQL("CREATE TABLE tags_vocab (id INTEGER PRIMARY KEY AUTOINCREMENT, word_fk INTEGER NOT NULL ON CONFLICT IGNORE, tag_id INTEGER NOT NULL ON CONFLICT IGNORE)");
db.execSQL("INSERT INTO tags_vocab (word_fk, tag_id) SELECT word_fk, tag_id from tmp_tags_vocab");
db.execSQL("CREATE UNIQUE INDEX idx_tags_vocab ON tags_vocab (tag_id ASC, word_fk ASC)");
db.execSQL("DROP TABLE tmp_tags_vocab");
我需要将NOT NULL ON CONFLICT IGNORE
参数添加到tags_vocab的两个列中,但由于 sqliteALTER TABLE
不允许这种程度的控制,我必须重新创建整个表。
问题是上述命令似乎都可以正常运行并提交,但是当我从应用程序的私有数据库目录中提取升级后数据库时,“修改”表似乎完全没有变化。这是“修改”表的 DDL:
CREATE TABLE tags_vocab (
id INTEGER PRIMARY KEY AUTOINCREMENT,
word_fk INTEGER,
tag_id INTEGER
);
DDL应如下所示:
CREATE TABLE tags_vocab (
id INTEGER PRIMARY KEY AUTOINCREMENT,
word_fk INTEGER NOT NULL ON CONFLICT IGNORE,
tag_id INTEGER NOT NULL ON CONFLICT IGNORE
);
重新创建表时我做错了什么吗?