要在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
这是两步过程:
使用以下方法删除该表中的所有数据
Delete from TableName
Run Code Online (Sandbox Code Playgroud)然后:
DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
Run Code Online (Sandbox Code Playgroud)bar*_*ddu 44
恕我直言,删除表并重新创建它更有效.是的,在这种情况下你可以使用"IF EXISTS".
Cod*_*ops 44
做吧delete.这来自SQLite文档:
"当从DELETE语句中省略WHERE并且被删除的表没有触发器时,SQLite使用优化来擦除整个表内容,而不必单独访问表的每一行.这种"截断"优化使删除运行得多在SQLite版本3.6.5之前,truncate优化还意味着sqlite3_changes()和sqlite3_total_changes()接口以及count_changes pragma实际上不会返回已删除行的数量.从版本3.6.5开始,该问题已得到修复".
我得到它与:
SQLiteDatabase db= this.getWritableDatabase();
db.delete(TABLE_NAME, null, null);
Run Code Online (Sandbox Code Playgroud)
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/