截断SQLite表,如果它存在?
要在SQLite中截断一个表,我需要使用下面的语法:
DELETE FROM someTable
但是,如何才能截断表,如果它存在?
不幸的是这会抛出一个错误:
DELETE FROM someTable IF EXISTS
这也不起作用:
DELETE IF EXISTS FROM someTable
谢谢。
恕我直言,删除表和重新创build它是更有效的。 是的,你可以在这种情况下使用“IF EXISTS”。
这是两个步骤的过程:
-
使用以下命令删除表中的所有数据:
Delete from TableName
-
然后:
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(); }