Quelle est la commande pour supprimer toutes les tables dans SQLite?
De même, j'aimerais supprimer tous les index.
rm db/development.sqlite3
Je ne pense pas que vous puissiez supprimer toutes les tables d'un coup mais vous pouvez procéder comme suit pour obtenir les commandes:
select 'drop table ' || name || ';' from sqlite_master
where type = 'table';
Le résultat de ceci est un script qui supprimera les tables pour vous. Pour les index, il suffit de remplacer table par index.
Vous pouvez utiliser d'autres clauses dans la section where
pour limiter les tables ou les index sélectionnés (par exemple, "and name glob 'pax_*'
" pour ceux commençant par "pax_").
Vous pouvez combiner la création de ce script avec son exécution dans un script simple bash (ou cmd.exe), de sorte qu'il ne reste qu'une seule commande à exécuter.
Si vous ne vous souciez pas de d'aucun des informations de la base de données, je pense que vous pouvez simplement supprimer le fichier dans lequel il est stocké - c'est probablement plus rapide. Je n'ai jamais testé cela, mais je ne vois pas pourquoi cela ne fonctionnerait pas.
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 disposez d'une sauvegarde.
PRAGMA writable_schema = 1;
delete from sqlite_master where type in ('table', 'index', 'trigger');
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;
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);
}
J'aimerais ajouter à d'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'incrémentation automatique.
Utiliser 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]))
J'ai eu ce problème dans Android et j'ai écrit une méthode similaire à it-west.
Comme j'ai utilisé les clés primaires AUTOINCREMENT
dans mes tables, il y avait une table appelée sqlite_sequence
. SQLite se bloquait lorsque la routine tentait de supprimer cette table. Je ne pouvais pas attraper l'exception non plus. En regardant https://www.sqlite.org/fileformat.html#internal_schema_objects , j'ai appris qu'il pouvait y avoir plusieurs de ces tables internal schema que je ne voulais pas supprimer. La documentation indique que l’une de ces tables a un nom commençant par sqlite_, j’ai donc écrit cette méthode.
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();
}
}
Une fois que vous avez supprimé toutes les tables (et les index disparaissent lorsque la table disparaît), il ne reste plus rien dans une base de données SQLite à ma connaissance, bien que le fichier ne semble pas se réduire (à partir d'un test rapide que je viens de faire). ).
Donc, supprimer le fichier semble être le plus rapide - il devrait simplement être recréé lorsque votre application tente d'accéder au fichier db.
Je ne peux pas dire que ce soit la solution la plus sécurisée ou portable, mais cela fonctionne pour mes scripts de test:
.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
Ce bit de code redirige la sortie vers un fichier temporaire, construit les commandes 'drop table' que je veux exécuter (envoi des commandes dans le fichier temporaire), rétablit la sortie en sortie standard, puis exécute les commandes du fichier, et enfin supprime le fichier.