截断SQLite表,如果它存在?

要在SQLite中截断一个表,我需要使用下面的语法:

DELETE FROM someTable 

但是,如何才能截断表,如果它存在?

不幸的是这会抛出一个错误:

 DELETE FROM someTable IF EXISTS 

这也不起作用:

 DELETE IF EXISTS FROM someTable 

谢谢。

恕我直言,删除表和重新创build它是更有效的。 是的,你可以在这种情况下使用“IF EXISTS”。

这是两个步骤的过程:

  1. 使用以下命令删除表中的所有数据:

     Delete from TableName 
  2. 然后:

     DELETE FROM SQLITE_SEQUENCE WHERE name='TableName'; 

只要delete 。 这是从SQLite文档:

截断优化

“当DELETE语句中删除了WHERE并且被删除的表没有触发器时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行,这种”截断“优化使删除运行得多在SQLite版本3.6.5之前,truncate优化还意味着sqlite3_changes()和sqlite3_total_changes()接口和count_changes编译指示实际上不会返回已删除行的数目。从版本3.6.5开始,该问题已得到修复“。

我得到它与工作:

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

如果表名不存在,则不会有任何logging返回!

你也可以使用

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

如果count是1,则表示存在,否则返回0

删除后我也使用VACUUM命令。 所以对于完整的TRUNCATE相当于我使用这个代码:

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

删除不工作,我重置自动递增

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

要了解关于VACUUM的更多信息,请访问: https : //blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

不幸的是,我们在SQLite中没有“TRUNCATE TABLE”命令,但是可以使用SQLite的DELETE命令从现有表中删除完整的数据,不过build议使用DROP TABLE命令删除整个表,再次创build它。

“sqllite”没有像“mysql”那样的“TRUNCATE”顺序,那么我们必须得到其他方式…这个函数(reset_table)首先删除表中的所有数据,然后重置表中的AUTOINCREMENT键….现在,您可以在任何你想要的地方使用这个function…

例如:

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