2010-11-25 4 views
47

SQLiteでテーブルを切り捨てるには、次の構文を使用する必要があります。SQLiteテーブルが存在する場合は切り捨てますか?

DELETE FROM someTable 

しかし、テーブルが存在する場合にはどのように切り捨てますか?

残念ながら、これはエラーをスローします:

DELETE FROM someTable IF EXISTS 

これは動作しません:

DELETE IF EXISTS FROM someTable 

ありがとう。

答えて

40

IMHOの場合、テーブルを削除してから再作成する方が効率的です。そして、はい、あなたはこの場合「IF存在」を使うことができます。

+1

:自動インクリメント

DELETE FROM "sqlite_sequence" WHERE "name"='<table>'; 

あなたはここに行くことができVACUUMの詳細を読むにはリセット用

DELETE FROM <table>; UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>'; VACUUM; 

の削除は、私のために働いていません:だからTRUNCATEフル同等のため、私はこのコードを使用します1右。現在SQLiteに "If EXISTS"が削除されていないので、あなたのアプローチはうまくいきます。 – MPelletier

+2

'DELETE FROM'はSQLiteに行がトリガされていない限り個々の行を訪問させるので、一般的には合理的に効率的です。 – Brian

+3

@Brian 3.6.5以降、SQLiteは個々の行の訪問を避けるための「切り捨て」最適化を導入しました。参照:http://stackoverflow.com/a/14402146/363573 – Stephan

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); 
+1

しかし、主キー列は自動インクリメントに設定されます。 – Elshan

49

これは、2段階のプロセスである:

  1. は、すべてのデータを削除します。そのテーブルから:

    その後
    Delete from TableName 
    
  2. DELETE FROM SQLITE_SEQUENCE WHERE name='TableName'; 
    
+1

私は2番目のものがauto-incカウンタをリセットすると思いますか? – DanMan

+2

@ダンマンはい、正しい2番目のステートメントは、インデックスをリセットします。 – Blackberry

+1

この回答にはSQLITE_SEQUENCEの説明がありません – sparkyShorts

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."

+1

そして、 'SQLITE_SEQUENCE'テーブルの関連する行をクリアして' autoincrement'をリセットすることを忘れないでください – itsho

0

残念ながら、我々はSQLiteの中で「TRUNCATE TABLEを」コマンドを持っていないが、それはお勧めですが、あなたは、既存のテーブルから完全なデータを削除するためにSQLiteののDELETEコマンドを使用することができますDROP TABLEコマンドを使用して完全な表を削除し、再度作成し直してください。

0

"sqllite"はmysqlのような "TRUNCATE"命令を持っていません。 この関数(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(); 
} 
関連する問題