web-dev-qa-db-fra.com

Tronquer une table SQLite si elle existe?

Pour tronquer une table dans SQLite, je dois utiliser cette syntaxe:

DELETE FROM someTable

Mais comment tronquer la table uniquement si elle existe?

Malheureusement, cela génère une erreur:

DELETE FROM someTable IF EXISTS

Cela ne marche pas non plus:

DELETE IF EXISTS FROM someTable

Merci.

52
dan

IMHO, il est plus efficace de supprimer la table et de la recréer. Et oui, vous pouvez utiliser "SI EXISTE" dans ce cas.

43
barti_ddu

C'est le processus en deux étapes:

  1. Supprimer toutes les données de cette table en utilisant:

    Delete from TableName
    
  2. Ensuite:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    
56
iKushal

Faites juste delete. Cela provient de la documentation SQLite:

L'optimisation des tronçons

"Lorsque le WHERE est omis d'une instruction DELETE et que la table en cours de suppression n'a pas de déclencheur, SQLite utilise une optimisation pour effacer tout le contenu de la table sans avoir à visiter chaque ligne de la table individuellement. Cette optimisation" tronquée "rend la suppression beaucoup Avant SQLite version 3.6.5, l’optimisation des tronçons signifiait également que les interfaces sqlite3_changes () et sqlite3_total_changes () et le pragma count_changes ne renverraient pas le nombre de lignes supprimées. Ce problème a été corrigé à partir de la version 3.6.5 . "

42
CodeChops

Je l'ai eu pour travailler avec:

SQLiteDatabase db= this.getWritableDatabase();
        db.delete(TABLE_NAME, null, null);
8
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'

Si le nom de la table n'existe pas, aucun enregistrement ne sera renvoyé!

Vous pouvez aussi bien utiliser 

SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>' 

si le nombre est 1, la table signifie qu'il existe, sinon il renverrait 0

7
Jaykay

Après avoir supprimé, j'utilise également la commande VACUUM. Donc, pour un équivalent TRUNCATE complet, j'utilise ce code:

DELETE FROM <table>;
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>';
VACUUM;

La suppression ne fonctionne pas pour moi pour réinitialiser l'incrément automatique 

DELETE FROM "sqlite_sequence" WHERE "name"='<table>';

Pour en savoir plus sur VACUUM, vous pouvez aller ici: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

4
Dariusz81

Malheureusement, SQLite ne contient pas de commande "TRUNCATE TABLE", mais vous pouvez utiliser la commande DELETE de SQLite pour supprimer les données complètes d'une table existante, bien qu'il soit recommandé d'utiliser la commande DROP TABLE pour supprimer la table complète et la recréer. c'est encore une fois.

0
user2956139

"sqllite" n'a pas l'ordre "TRUNCATE" comme celui de mysql, alors nous devons utiliser un autre moyen ... cette fonction (reset_table) supprime toutes les données de la table puis réinitialise la clé AUTOINCREMENT dans la table .... maintenant vous pouvez utiliser cette fonction partout où vous le voulez ...

exemple :

private SQLiteDatabase mydb;
private final String dbPath = "data/data/your_project_name/databases/";
private final String dbName = "your_db_name";


public void reset_table(String table_name){
    open_db();

    mydb.execSQL("Delete from "+table_name);
    mydb.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE name='"+table_name+"';");

    close_db();
}

public void open_db(){

    mydb = SQLiteDatabase.openDatabase(dbPath + dbName + ".db", null, SQLiteDatabase.OPEN_READWRITE);
}
public void close_db(){

    mydb.close();
}
0
Ferhad Konar