2010-11-25 22 views
47

para truncar una tabla en SQLite necesito utilizar esta sintaxis:¿Truncar una tabla SQLite si existe?

DELETE FROM someTable 

Pero ¿cómo truncar la tabla sólo si es que existe?

Desafortunadamente esto genera un error:

DELETE FROM someTable IF EXISTS 

Esto no funciona bien:

DELETE IF EXISTS FROM someTable 

Gracias.

Respuesta

40

En mi humilde opinión, es más eficiente soltar la mesa y volver a crearla. Y sí, puede usar "SI EXISTE" en este caso.

+1

+ 1 Derecha No existe "If EXISTS" actualmente para eliminar en SQLite, por lo que su enfoque funciona bien. – MPelletier

+2

'DELETE FROM' hará que SQLite visite filas individuales, a menos que esas filas tengan desencadenantes, por lo que generalmente es razonablemente eficiente. – Brian

+3

@Brian Desde 3.6.5, SQLite ha introducido una optimización "truncada" para evitar la visita de filas individuales. Consulte: http://stackoverflow.com/a/14402146/363573 – Stephan

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

Si el nombre de la tabla no existe, entonces no habría ningún registros devueltos!

Puede también utilizar

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

lo tengo para trabajar con:

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

Pero la columna de la clave principal está configurada en incremento automático. Luego aumentará. – Elshan

49

es el proceso de dos pasos:

  1. Eliminar todos los datos de esa mesa usando:

    Delete from TableName 
    
  2. continuación:

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

Supongo que el segundo restablece el contador de autoinc? – DanMan

+2

@DanMan Sí, tiene la segunda declaración correcta restablecerá el índice. – Blackberry

+1

A esta respuesta le falta una explicación de SQLITE_SEQUENCE – sparkyShorts

39

Eso sí, delete. Esto es de la documentación de 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

Y no olvide restablecer 'autoincrement' borrando la fila correspondiente en la tabla' SQLITE_SEQUENCE' – itsho

0

Desafortunadamente, no tenemos un "TRUNCATE TABLE" comando en SQLite, pero se puede utilizar el comando de SQLite DELETE para eliminar los datos completos de una tabla existente, aunque se recomienda para utilizar el comando DROP TABLE para soltar la tabla completa y volver a crearla una vez más.

0

"sqllite" no tienen orden "TRUNCATE" como que mysql, entonces tenemos que ir por otro camino ... esta función (reset_table) frist borra todos los datos en la tabla y luego reinicia la clave AUTOINCREMENT en la tabla ... .. ahora puede utilizar esta función en todas partes desea ...

ejemplo:

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

Después de eliminar también estoy usando VACUUM comando.Así, por completo TRUNCATE equivalente utilizo este código:

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

esta acción no está funcionando para mí para el reajuste auto del incremento

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

Para leer más sobre VACÍO se puede ir aquí: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

Cuestiones relacionadas