2010-11-25 6 views
47

tronquer une table SQLite je dois utiliser cette syntaxe:Tronquer une table SQLite si elle existe?

DELETE FROM someTable 

Mais comment puis-je tronque la table que si elle existe?

Malheureusement, ce génère une erreur:

DELETE FROM someTable IF EXISTS 

Cela ne fonctionne pas non plus:

DELETE IF EXISTS FROM someTable 

Merci.

Répondre

40

À mon humble avis, il est plus efficace de laisser tomber la table et de la recréer. Et oui, vous pouvez utiliser "IF EXISTS" dans ce cas.

+1

+ 1 Droit. Il n'y a pas de "Si EXISTS" actuellement à supprimer dans SQLite, donc votre approche fonctionne bien. – MPelletier

+2

'DELETE FROM' obligera SQLite à visiter des lignes individuelles à moins que ces lignes aient des triggers, donc c'est généralement raisonnablement efficace. – Brian

+3

@Brian Depuis 3.6.5, SQLite a introduit une optimisation "tronquée" pour éviter la visite de lignes individuelles. Voir: http://stackoverflow.com/a/14402146/363573 – Stephan

7
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>' 

Si le nom de la table n'existe pas alors il n'y aurait pas d'enregistrements retournés!

Vous pouvez aussi bien utiliser

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

if the count is 1, means table exists, otherwise, it would return 0

8

Je l'ai à travailler avec:

SQLiteDatabase db= this.getWritableDatabase(); 
     db.delete(TABLE_NAME, null, null); 
+1

Mais la colonne de clé primaire est définie en incrémentation automatique. Ensuite, elle sera incrémentée. – Elshan

49

Il est le processus en deux étapes:

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

    Delete from TableName 
    
  2. Puis:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName'; 
    
+1

Je suppose que le 2ème réinitialise le compteur auto-inc? – DanMan

+2

@DanMan Oui, la seconde instruction correcte réinitialisera l'index. – Blackberry

+1

Cette réponse ne contient pas d'explication de SQLITE_SEQUENCE – sparkyShorts

39

Il suffit de faire delete. Ceci est de la documentation SQLite:

The Truncate Optimization

"When the WHERE is omitted from a DELETE statement and the table being deleted has no triggers, SQLite uses an optimization to erase the entire table content without having to visit each row of the table individually. This "truncate" optimization makes the delete run much faster. Prior to SQLite version 3.6.5, the truncate optimization also meant that the sqlite3_changes() and sqlite3_total_changes() interfaces and the count_changes pragma will not actually return the number of deleted rows. That problem has been fixed as of version 3.6.5."

+1

Et n'oubliez pas de réinitialiser 'autoincrement' en effaçant la ligne correspondante de la table SQLITE_SEQUENCE' – itsho

0

Malheureusement, nous ne disposons pas d'une commande « TRUNCATE TABLE » dans SQLite, mais vous pouvez utiliser la commande DELETE de SQLite pour supprimer les données complètes d'une table existante, mais il est recommandé pour utiliser la commande DROP TABLE pour supprimer la table complète et la recréer à nouveau.

0

"sqllite" n'a pas "TRUNCATE" ordre comme que mysql, alors nous devons obtenir d'une autre manière ... cette fonction (reset_table) frist supprimer toutes les données dans le tableau, puis réinitialiser la clé AUTOINCREMENT dans la table .. .. vous pouvez maintenant utiliser cette fonction chaque endroit où vous 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(); 
} 
2

Après avoir supprimé j'utilise aussi la commande VACUUM.Donc, pour toute TRUNCATE équivalent-je utiliser ce code:

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

suppression ne fonctionne pas pour moi reset Pour en savoir plus Incrémentation automatique

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

à propos VIDE, vous pouvez aller ici: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

Questions connexes