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

71

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

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

Теги:
database
rdbms

8 ответов

25
Лучший ответ
rm db/development.sqlite3
  • 0
    да, это удаляет базу данных, но в sqlite может быть другое, кроме таблиц; Смотрите мой полный ответ для деталей
  • 8
    Если в базе данных открыто несколько соединений, это не будет работать. На * nix, который просто удалит имя, и соединения будут продолжать работать с безымянным файлом базы данных, пока они не закроют свои дескрипторы. Если вы хотите переписать схему (удалить все таблицы, создать новые таблицы), у вас будут проблемы.
Показать ещё 2 комментария
74

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

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

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

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

Вы могли бы объединить создание этого script с его запуском в простом bash (или cmd.exe) script, так что будет работать только одна команда.

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

  • 0
    Благодарю. Очень странно, что нет простой команды, а вместо этого хакерский SQL-запрос.
  • 5
    Ну, самый простой способ получить пустую базу данных sqlite - это просто удалить файл, а затем подключиться к нему.
Показать ещё 4 комментария
66

Хотя верно, что нет команды 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;
  • 1
    как выполнить их в onUpgrade () ??
  • 0
    Просто выполните DDL, это достаточно
Показать ещё 9 комментариев
22

У меня была такая же проблема с 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);
}
4

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

2

Использование 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]))
2

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

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

  • 1
    Файл не сжимается, потому что sqlite работает не так - он вернет дисковое пространство операционной системе только в том случае, если вы очистите файл (в основном, воссоздаете его с нуля). До этого в файле много места для повторного использования.
  • 0
    Ях. Таким образом, удаление всех таблиц и очистка будут иметь смысл, если у вас нет прав на удаление / создание файлов или возникла странная многопользовательская ситуация. В противном случае просто удалить вещь?
1

У меня была эта проблема в android, и я написал метод, похожий на it-west.

Поскольку я использовал 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();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню