我有一个简单的问题:如何删除sqlite表的所有索引? 我有多个使用随机名称创建的索引。
的问候,
Pentium10
答案 0 :(得分:19)
获取数据库中的所有索引名称
SELECT name FROM sqlite_master WHERE type == 'index'
对于特定的表格:
SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name == 'table Name'
然后在您的语言中,迭代思考结果并删除它们
FOR x IN RESULTSET
SQL = "DROP INDEX " & X
答案 1 :(得分:3)
我不知道你可以在一个命令中删除所有索引 - IMO你必须按名称删除每个索引。另请参阅:http://www.sqlite.org/lang_dropindex.html另外,请查看此信息以获取更多信息:Drop all tables command
答案 2 :(得分:0)
#!/bin/bash
DB=your_sqlite.db
TABLE="some_table"
INDEXES="$(echo "SELECT name FROM sqlite_master WHERE type == 'index' AND tbl_name = '$TABLE;" | sqlite3 $DB)"
for i in $INDEXES; do
echo "DROP INDEX '$i';" | sqlite3 $DB
done
确保在调用此脚本时没有其他进程访问数据库,或者如果不可能添加
PRAGMA busy_timeout=20000;
您发送到数据库的每个echo
中的
答案 3 :(得分:0)
以下是如何在 Android 中执行此操作(在Robert's answer和this SQLite page的帮助下:
/*
* Drop all indexes.
*/
try {
Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type == 'index'", null);
int numIndexes = (cursor == null) ? 0 : cursor.getCount();
Log.d(LOG_TAG, "Num indexes to drop: " + numIndexes);
if (numIndexes > 0) {
String[] indexNames = new String[numIndexes];
int i = 0;
while (cursor.moveToNext()) {
indexNames[i++] = cursor.getString(cursor.getColumnIndexOrThrow("name"));
}
for (i = 0; i < indexNames.length; i++) {
Log.d(LOG_TAG, "Dropping index: " + indexNames[i] + "...");
db.execSQL("DROP INDEX " + indexNames[i]);
Log.e(LOG_TAG, "...index dropped!");
}
}
}
catch(Exception e) {
Log.e(LOG_TAG, "Error dropping index", e);
}