SQLiteでテーブルを切り捨てるには、次の構文を使用する必要があります。SQLiteテーブルが存在する場合は切り捨てますか?
DELETE FROM someTable
しかし、テーブルが存在する場合にはどのように切り捨てますか?
残念ながら、これはエラーをスローします:
DELETE FROM someTable IF EXISTS
これは動作しません:
DELETE IF EXISTS FROM someTable
ありがとう。
SQLiteでテーブルを切り捨てるには、次の構文を使用する必要があります。SQLiteテーブルが存在する場合は切り捨てますか?
DELETE FROM someTable
しかし、テーブルが存在する場合にはどのように切り捨てますか?
残念ながら、これはエラーをスローします:
DELETE FROM someTable IF EXISTS
これは動作しません:
DELETE IF EXISTS FROM someTable
ありがとう。
IMHOの場合、テーブルを削除してから再作成する方が効率的です。そして、はい、あなたはこの場合「IF存在」を使うことができます。
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
を使用することができます私はそれがで動作するようになった:
SQLiteDatabase db= this.getWritableDatabase();
db.delete(TABLE_NAME, null, null);
しかし、主キー列は自動インクリメントに設定されます。 – Elshan
これは、2段階のプロセスである:
は、すべてのデータを削除します。そのテーブルから:
その後Delete from TableName
:
DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
私は2番目のものがauto-incカウンタをリセットすると思いますか? – DanMan
@ダンマンはい、正しい2番目のステートメントは、インデックスをリセットします。 – Blackberry
この回答にはSQLITE_SEQUENCEの説明がありません – sparkyShorts
ちょうどdelete
を行います。これは、SQLiteのドキュメントからです:
"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."
そして、 'SQLITE_SEQUENCE'テーブルの関連する行をクリアして' autoincrement'をリセットすることを忘れないでください – itsho
残念ながら、我々はSQLiteの中で「TRUNCATE TABLEを」コマンドを持っていないが、それはお勧めですが、あなたは、既存のテーブルから完全なデータを削除するためにSQLiteののDELETE
コマンドを使用することができますDROP TABLE
コマンドを使用して完全な表を削除し、再度作成し直してください。
"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();
}
私もVACUUM
コマンドを使用しています削除した後。+ https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/
:自動インクリメント
あなたはここに行くことができVACUUMの詳細を読むにはリセット用
の削除は、私のために働いていません:だから
TRUNCATE
フル同等のため、私はこのコードを使用します1右。現在SQLiteに "If EXISTS"が削除されていないので、あなたのアプローチはうまくいきます。 – MPelletier'DELETE FROM'はSQLiteに行がトリガされていない限り個々の行を訪問させるので、一般的には合理的に効率的です。 – Brian
@Brian 3.6.5以降、SQLiteは個々の行の訪問を避けるための「切り捨て」最適化を導入しました。参照:http://stackoverflow.com/a/14402146/363573 – Stephan