it-swarm.com.de

Alle Tabellen löschen

Wie lautet der Befehl zum Löschen aller Tabellen in SQLite? 

Ebenso möchte ich alle Indizes löschen.

75
alamodey
rm db/development.sqlite3
33
alamodey

Ich glaube nicht, dass Sie alle Tabellen in einem Treffer löschen können, aber Sie können die folgenden Befehle ausführen, um die Befehle zu erhalten:

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

Die Ausgabe davon ist ein Skript, das die Tabellen für Sie löscht. Für Indizes ersetzen Sie einfach die Tabelle durch den Index.

Sie können andere Klauseln im Abschnitt where verwenden, um die Auswahl der ausgewählten Tabellen oder Indizes einzuschränken (z. B. "and name glob 'pax_*'" für diejenigen, die mit "pax_" beginnen).

Sie können die Erstellung dieses Skripts mit der Ausführung in einem einfachen Bash-Skript (oder cmd.exe) kombinieren, sodass nur ein Befehl ausgeführt werden muss.

Wenn Sie sich nicht für any der Informationen in der Datenbank interessieren, denke ich, dass Sie einfach die Datei löschen können, die auf der Festplatte gespeichert ist - das ist wahrscheinlich schneller. Ich habe das noch nie getestet, kann aber nicht verstehen, warum es nicht funktioniert.

74
paxdiablo

Es ist zwar wahr, dass es keinen Befehl DROP ALL TABLES gibt, Sie können jedoch die folgenden Befehle verwenden.

Hinweis: Diese Befehle können Ihre Datenbank beschädigen. Stellen Sie daher sicher, dass Sie über eine Sicherung verfügen

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

sie möchten dann den gelöschten Speicherplatz mit wiederherstellen

VACUUM;

und ein guter Test, um sicherzustellen, dass alles in Ordnung ist

PRAGMA INTEGRITY_CHECK;
71
Noah

Ich hatte das gleiche Problem mit SQLite und Android. Hier ist meine Lösung:

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);
}
22
it-west.net

Ich möchte anderen Antworten hinzufügen, die das Löschen von Tabellen betreffen und nicht die Datei löschen. Sie können auch delete from sqlite_sequence ausführen, um die automatischen Inkrementierungssequenzen zurückzusetzen.

4
Flavio Tordini

Pysqlite verwenden: 

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]))
3
user3467349

Ich hatte dieses Problem in Android und schrieb eine ähnliche Methode wie it-west.

Da ich AUTOINCREMENT Primärschlüssel in meinen Tabellen verwendet habe, gab es eine Tabelle mit dem Namen sqlite_sequence. SQLite stürzte ab, wenn die Routine versuchte, diese Tabelle zu löschen. Ich konnte die Ausnahme auch nicht fangen. Beim Betrachten von https://www.sqlite.org/fileformat.html#internal_schema_objects habe ich erfahren, dass es mehrere dieser internen Schema -Tabellen geben kann, die ich nicht löschen möchte. Die Dokumentation besagt, dass alle diese Tabellen mit sqlite_ beginnen, also habe ich diese Methode geschrieben

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();
    }
}
2
Jon

Wenn Sie alle Tabellen gelöscht haben (und die Indizes verschwinden, wenn die Tabelle gelöscht wird), ist in einer SQLite-Datenbank meines Wissens nach nichts mehr vorhanden, obwohl die Datei nicht zu schrumpfen scheint (durch einen schnellen Test, den ich gerade gemacht habe ). 

Das Löschen der Datei scheint also am schnellsten zu sein - es sollte nur neu erstellt werden, wenn Ihre App versucht, auf die Datenbankdatei zuzugreifen.

2
Mike Woodhouse

Ich kann nicht sagen, dass dies die kugelsicherste oder tragbarste Lösung ist, aber es funktioniert für meine Testskripte:

.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

Dieses Bit Code leitet die Ausgabe in eine temporäre Datei um, erstellt die auszuführenden 'drop table' -Befehle (Senden der Befehle an die temporäre Datei), setzt die Ausgabe auf Standard zurück, führt dann die Befehle der Datei aus und schließlich Entfernt die Datei.

0
Matt Malone