2010-11-25 65 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/