如何删除sqlite表的所有索引

时间:2010-01-23 00:56:36

标签: sqlite

我有一个简单的问题:如何删除sqlite表的所有索引? 我有多个使用随机名称创建的索引。

的问候,
Pentium10

4 个答案:

答案 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 answerthis 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);
}