2010-11-25 40 views
47

要截断SQLite中我需要用这个语法表:截断SQLite表,如果它存在?

DELETE FROM someTable 

但是我怎么截断,只有当它存在的表?

不幸的是这将引发一个错误:

DELETE FROM someTable IF EXISTS 

这不起作用或者:

DELETE IF EXISTS FROM someTable 

感谢。

回答

40

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

+1

+ 1对。目前在SQLite中没有“If EXISTS”用于删除,所以你的方法很好。 – MPelletier 2010-11-25 19:37:10

+2

`DELETE FROM`会导致SQLite访问单个行,除非这些行具有触发器,所以它通常是相当高效的。 – Brian 2011-08-24 20:14:35

+3

@Brian从3.6.5开始,SQLite引入了一个“截断”优化,以避免访问单个行。请参阅:http://stackoverflow.com/a/14402146/363573 – Stephan 2015-05-21 22:46:04

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

如果表名称不存在,那么就不会有任何返回的记录!

您可以如用

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

if the count is 1, means table exists, otherwise, it would return 0

8

我得到它的工作:

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

这是两个步骤:

  1. 删除所有数据从该表使用:

    Delete from TableName 
    
  2. 然后:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName'; 
    
39

只是做delete。这是从SQLite的文档:

The Truncate Optimization

"When the WHERE is omitted from a DELETE statement and the table being deleted has no triggers, SQLite uses an optimization to erase the entire table content without having to visit each row of the table individually. This "truncate" optimization makes the delete run much faster. Prior to SQLite version 3.6.5, the truncate optimization also meant that the sqlite3_changes() and sqlite3_total_changes() interfaces and the count_changes pragma will not actually return the number of deleted rows. That problem has been fixed as of version 3.6.5."

0

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

0

“sqllite”没有像“mysql”那样的“TRUNCATE”顺序,那么我们必须得到其他方式... 此函数(reset_table)先删除表中的所有数据,然后重置表中的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(); 
} 
2

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