如果存在 SQLite 表,则截断它?

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

DELETE FROM someTable

但是如何只在表存在时截断它呢?

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

DELETE FROM someTable IF EXISTS

这也行不通:

DELETE IF EXISTS FROM someTable

谢谢。

117007 次浏览

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

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

如果表名不存在,则不会返回任何记录!

你也可以利用

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

如果计数为1,则表示表存在,否则返回0

我得到了它的工作:

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

这是一个两步走的过程:

  1. 使用以下方法从该表中删除所有数据:

    Delete from TableName
    
  2. Then:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    

只需执行 delete即可:

截断优化

”当从 DELETE 语句中省略 WHERE 并且被删除的表没有触发器时,SQLite 使用优化来删除整个表内容,而不必单独访问表的每一行。这种“截断”优化使删除运行快得多。在 SQLite 版本3.6.5之前,截断优化还意味着 sqlite3 _ changes ()和 sqlite3 _ total _ changes ()接口和 count _ changes 杂注实际上不会返回被删除的行数。这个问题已经在3.6.5版本中解决了。”

不幸的是,我们在 SQLite 中没有“ TRUNCATE TABLE”命令,但是您可以使用 SQLite 的 DELETE命令从现有表中删除完整的数据,尽管建议使用 DROP TABLE命令删除完整的表并重新创建它。

“ sqlite”不像 mysql 那样有“ TRUNCATE”顺序,那么我们必须另辟蹊径..。 该函数首先删除表中的所有数据,然后重置表中的 AUTOINCREMENT 键..。 现在你可以在任何地方使用这个函数。

例如:

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

删除之后,我还使用了 VACUUM命令。因此,对于完整的 TRUNCATE等价物,我使用以下代码:

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

对于重置自动增量,删除不起作用

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

想了解更多关于真空的信息,请点击这里: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

这很简单,只要按照两个步骤。 步骤 # 1。启动查询“ Delete from tableName”,它将删除表中的所有记录。

第二步。在 Sqlite Database 有一个名为“ Sqlite _ order”的表,只要浏览一下,你就可以把序列表明智地设置为“0”,这样它就会从 auto id“1”开始。** 请看附件中的截图。

enter image description here

Sqlite 中没有截断命令。

但可以通过以下方式实现:

  1. 删除所有记录;
    Delete from 'Table1';

那么

  1. 设置自动增量为0;
    UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'Table1';