我正在尝试将所有数据从sqlite表复制到另一个表(原因是更改主键,建议的方法是创建新表,复制数据,重命名等)。 沿途:
insert into new_table select * from old_table;
drop old_table;
alter table new_table rename to old_table;
现在的问题是,有时当我创建新表时,它的列顺序是不相同的,并且数据被完全弄乱了。不知道为什么,可能导致某些人拥有全新的表,而有些人具有旧表,这些表的升级脚本很少。无论如何,我要确保每一列都插入正确的列中。我可以确定只是手动命名所有列,但是即使以后再添加一些列以及为其他表添加列,我也希望这样做。我可能可以以某种方式查询列的名称,然后以我上面使用的语言(kotlin)构造查询,但是如果可能的话,我想在数据库级别执行此操作。
它在android上,但与问题不是很相关:) 谢谢!
答案 0 :(得分:0)
不幸的是,我不得不添加1个额外的查询来获取列。 其他查询都特别提到了所有列,而不是使用星号来确保正确的顺序。我的科特林方式:
fun columns(db: SQLiteDatabase, tableName: String): List<String> {
val sql = "pragma table_info($tableName)"
return db.rawQuery(sql, arrayOf()).use { cursor ->
(1..cursor.count).map {
cursor.moveToNext()
cursor.getString(cursor.getColumnIndexOrThrow("name"))
}
}
}
fun copyFromTableToTable(db: SQLiteDatabase, originalTableName: String, backupTableName: String) {
val columns = columns(db, backupTableName).joinToString(separator = ",")
db.execSQL("""INSERT INTO $backupTableName
($columns)
SELECT $columns FROM $originalTableName
""".trimMargin())
//db.execSQL("DROP TABLE $originalTableName;")
//db.execSQL("ALTER TABLE $backupTableName RENAME TO $originalTableName;")
}