截断SQLite表(如果存在)?

时间:2010-11-25 18:45:35

标签: sqlite

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

DELETE FROM someTable

但是,如果表存在,我该如何截断表?

不幸的是,这会引发错误:

DELETE FROM someTable IF EXISTS

这也不起作用:

DELETE IF EXISTS FROM someTable

感谢。

9 个答案:

答案 0 :(得分:56)

这是两个步骤:

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

    Delete from TableName
    
  2. 然后:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    

答案 1 :(得分:43)

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

答案 2 :(得分:43)

delete。这来自SQLite文档:

  

The Truncate Optimization

     

“当从DELETE语句中省略WHERE并且要删除的表没有触发器时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行。这种”截断“优化使得删除运行速度更快。在SQLite版本3.6.5之前,truncate优化还意味着sqlite3_changes()和sqlite3_total_changes()接口以及count_changes pragma实际上不会返回已删除行的数量。该问题已在版本中修复3.6.5“。

答案 3 :(得分:8)

我得到了它:

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

答案 4 :(得分:7)

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

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

您也可以使用

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

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

答案 5 :(得分:4)

删除后我也使用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/

答案 6 :(得分:0)

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

答案 7 :(得分:0)

&#34; sqllite&#34;没有&#34; TRUNCATE&#34;订单比mysql,然后我们必须得到其他方式... 这个函数(reset_table)frist删除表中的所有数据然后重置表中的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();
}

答案 8 :(得分:0)

**这很简单,只需执行2个步骤。 第1步。触发查询“从tableName删除”,它将删除表中的所有记录。

步骤2。 Sqlite数据库中有一个名为“ sqlite_sequence”的表,只需对其进行浏览,就可以将序列表明智地设置为“ 0”,这样它将从自动标识“ 1”开始。** 请参阅所附的屏幕截图。

enter image description here