как сбросить все индексы таблицы sqlite - PullRequest
7 голосов
/ 23 января 2010

У меня простой вопрос: как удалить все индексы таблицы sqlite? У меня есть несколько индексов, созданных со случайным именем.

С уважением,
Pentium10

Ответы [ 4 ]

19 голосов
/ 31 мая 2013

Чтобы получить все имена индексов в базе данных

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
3 голосов
/ 23 января 2010

Я не знаю, что вы можете удалить ВСЕ индексы в одной команде - IMO, вы должны удалить каждый по имени. См. Также: http://www.sqlite.org/lang_dropindex.html Кроме того, проверьте это для получения дополнительной информации: Команда удаления всех таблиц

0 голосов
/ 20 марта 2018

Вот как это сделать в Android (с помощью ответа Роберта и этой страницы SQLite :

/*
 * 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);
}
0 голосов
/ 11 января 2017
#!/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, который вы отправляете в базу данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...