截断SQLite表(如果存在)?

dan*_*dan 56 sqlite

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

DELETE FROM someTable
Run Code Online (Sandbox Code Playgroud)

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

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

DELETE FROM someTable IF EXISTS
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

DELETE IF EXISTS FROM someTable
Run Code Online (Sandbox Code Playgroud)

谢谢.

iKu*_*hal 58

这是两步过程:

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

    Delete from TableName
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    
    Run Code Online (Sandbox Code Playgroud)

  • 这个答案缺少对SQLITE_SEQUENCE的解释 (4认同)
  • 我假设第二个重置自动增量计数器? (2认同)
  • @DanMan是的,你是正确的第二个语句将重置索引. (2认同)

bar*_*ddu 44

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

  • @Brian自3.6.5以来,SQLite引入了"截断"优化,以避免单个行的访问.请参阅:http://stackoverflow.com/a/14402146/363573 (3认同)
  • `DELETE FROM`将导致SQLite访问各行,除非这些行有触发器,因此它通常相当有效. (2认同)

Cod*_*ops 44

做吧delete.这来自SQLite文档:

截断优化

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

  • 并且不要忘记通过清除`SQLITE_SEQUENCE`表上的相关行来重置`autoincrement` (2认同)

San*_*til 8

我得到它与:

SQLiteDatabase db= this.getWritableDatabase();
        db.delete(TABLE_NAME, null, null);
Run Code Online (Sandbox Code Playgroud)


Jay*_*kay 7

SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用

SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>' 
Run Code Online (Sandbox Code Playgroud)

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


小智 5

删除后,我也使用VACUUM命令。因此,对于完全TRUNCATE等效的代码,我使用以下代码:

DELETE FROM <table>;
UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>';
VACUUM;
Run Code Online (Sandbox Code Playgroud)

删除不适用于重置自动增量功能

DELETE FROM "sqlite_sequence" WHERE "name"='<table>';
Run Code Online (Sandbox Code Playgroud)

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