95 votes

Supprimer toutes les tables

Quelle est la commande pour supprimer toutes les tables dans SQLite?

De même, j'aimerais supprimer tous les index.

92voto

Noah Points 7332

S'il est vrai qu'il n'y a pas de commande DROP ALL TABLES, vous pouvez utiliser le jeu de commandes suivant.

Remarque: ces commandes risquent de corrompre votre base de données. Assurez-vous donc que vous avez une sauvegarde.

 PRAGMA writable_schema = 1;
delete from sqlite_master where type = 'table';
PRAGMA writable_schema = 0;
 

vous voulez ensuite récupérer l'espace supprimé avec

 VACUUM;
 

et un bon test pour s'assurer que tout va bien

 PRAGMA INTEGRITY_CHECK;
 

89voto

paxdiablo Points 341644

Je ne pense pas que vous pouvez supprimer toutes les tables d'un seul coup, mais vous pouvez effectuer les opérations suivantes pour obtenir les commandes:

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

La sortie de ce script qui va baisser les tables pour vous. Pour les index, il suffit de remplacer la table d'index.

Vous pouvez utiliser d'autres clauses de la where section pour limiter le nombre de tables et d'index sont sélectionnés (comme "and name glob 'pax_*'" pour ceux qui commencent avec "pax_").

Vous pouvez combiner la création de ce script avec le fonctionnement de celui-ci dans un simple bash (ou cmd.exe script donc il n'y a qu'une seule commande à exécuter.

Si vous ne se soucient pas de toute l'information dans la base de données, je pense que vous pouvez simplement supprimer le fichier, il est stocké dans hors du disque dur - c'est probablement plus rapide. Je n'ai jamais testé mais je ne vois pas pourquoi ça ne marcherait pas.

36voto

alamodey Points 4286
rm db/development.sqlite3

22voto

it-west.net Points 68

J'ai eu le même problème avec SQLite et Android. Voici ma solution:

 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);
}
 

4voto

Flavio Tordini Points 124

J'aimerais ajouter aux autres réponses impliquant la suppression de tables et non la suppression du fichier, que vous pouvez également exécuter delete from sqlite_sequence pour réinitialiser les séquences d'auto-incrémentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X