Команда удалить все таблицы

какова команда для удаления всех таблиц в SQLite?

аналогично, я хотел бы удалить все индексы.

9 ответов


Я не думаю, что вы можете сбросить все таблицы одним ударом, но вы можете сделать следующее, Чтобы получить команды:

select 'drop table ' || name || ';' from sqlite_master
    where type = 'table';

вывод этого сценария, который будет отбрасывать таблицы для вас. Для индексов просто замените таблицу на index.

вы можете использовать другие пункты where Раздел для ограничения выбора таблиц или индексов (например,"and name glob 'pax_*' "для тех, кто начинается с "pax_").

вы можете объединить создание этого скрипта с его запуском в простой Баш (или Cmd.exe) скрипт так что есть только одна команда для запуска.

Если вы не заботитесь о любой информации в БД, я думаю, вы можете просто удалить файл хранится на жестком диске - это, наверное, быстрее. Я никогда не тестировал это, но я не вижу, почему это не сработает.


хотя верно, что нет команды DROP ALL TABLES, вы можете использовать следующий набор команд.

Примечание: эти команды могут повредить вашу базу данных, поэтому убедитесь, что у вас есть резервная копия

PRAGMA writable_schema = 1;
delete from sqlite_master where type in ('table', 'index', 'trigger');
PRAGMA writable_schema = 0;

затем вы хотите восстановить удаленное пространство с помощью

VACUUM;

и хороший тест, чтобы убедиться, что все ок

PRAGMA INTEGRITY_CHECK;

rm db/development.sqlite3

У меня была такая же проблема с SQLite и Android. Вот мое решение:

List<String> tables = new ArrayList<String>();
Cursor cursor = db.rawQuery("SELECT * FROM sqlite_master WHERE type='table';", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
    String tableName = cursor.getString(1);
    if (!tableName.equals("android_metadata") &&
            !tableName.equals("sqlite_sequence"))
        tables.add(tableName);
    cursor.moveToNext();
}
cursor.close();

for(String tableName:tables) {
    db.execSQL("DROP TABLE IF EXISTS " + tableName);
}

Я хотел бы добавить к другим ответам, связанным с удалением таблиц и не удалением файла, который вы также можете выполнить delete from sqlite_sequence сбросить автоинкремент последовательности.


Как только вы отбросили все таблицы (и индексы исчезнут, когда таблица пойдет), то, насколько я знаю, в базе данных SQLite ничего не осталось, хотя файл, похоже, не сжимается (от быстрого теста, который я только что сделал).

поэтому удаление файла будет казаться самым быстрым - он должен быть просто воссоздан, когда ваше приложение пытается получить доступ к файлу БД.


используя pysqlite:

tables = list(cur.execute("select name from sqlite_master where type is 'table'"))

cur.executescript(';'.join(["drop table if exists %s" %i for i in tables]))

у меня была эта проблема в Android, и я написал метод, похожий на него-Запад.

потому что я использовал AUTOINCREMENT первичные ключи в моих таблицах, была таблица под названием sqlite_sequence. Модуль SQLite будет сбой при рутинную пытался бросить эту таблицу. Я тоже не уловил исключения. Глядя на https://www.sqlite.org/fileformat.html#internal_schema_objects, я узнал, что их может быть несколько внутренние схемы таблицы, которые я не хотел отказаться. Этот в документации говорится, что любая из этих таблиц имеет имена, начинающиеся с SQLite Итак, я написал этот метод

private void dropAllUserTables(SQLiteDatabase db) {
    Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    //noinspection TryFinallyCanBeTryWithResources not available with API < 19
    try {
        List<String> tables = new ArrayList<>(cursor.getCount());

        while (cursor.moveToNext()) {
            tables.add(cursor.getString(0));
        }

        for (String table : tables) {
            if (table.startsWith("sqlite_")) {
                continue;
            }
            db.execSQL("DROP TABLE IF EXISTS " + table);
            Log.v(LOG_TAG, "Dropped table " + table);
        }
    } finally {
        cursor.close();
    }
}

Я не могу сказать, что это самое пуленепробиваемое или портативное решение, но оно работает для моих сценариев тестирования:

.output /tmp/temp_drop_tables.sql
select 'drop table ' || name || ';' from sqlite_master where type = 'table';
.output stdout
.read /tmp/temp_drop_tables.sql
.system rm /tmp/temp_drop_tables.sql

этот бит кода перенаправляет вывод во временный файл, создает команды "drop table", которые я хочу запустить (отправка команд во временный файл), устанавливает вывод обратно в standard out, затем выполняет команды из файла и, наконец, удаляет файл.