2010-11-25 3 views
47

Чтобы усечь таблицу в SQLite, мне нужно использовать следующий синтаксис:Усечь таблицу SQLite, если она существует?

DELETE FROM someTable 

Но как я усечение таблицы, только если она существует?

К сожалению, это выдает ошибку:

DELETE FROM someTable IF EXISTS 

Это не работает либо:

DELETE IF EXISTS FROM someTable 

Спасибо.

ответ

40

IMHO, более эффективно отбрасывать стол и воссоздавать его. И да, вы можете использовать «IF EXISTS» в этом случае.

+1

+ 1 Правильно. В SQLite нет «Если EXISTS» для удаления в SQLite, значит, ваш подход работает хорошо. – MPelletier 2010-11-25 19:37:10

+2

«УДАЛИТЬ ОТ» вызовет 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

К сожалению, у нас нет «TRUNCATE TABLE» команду в SQLite, но вы можете использовать DELETE команду SQLite, чтобы удалить полные данные из существующей таблицы, хотя рекомендуется чтобы использовать команду DROP TABLE, чтобы удалить полную таблицу и снова создать ее снова.

0

«sqllite» не имеет «TRUNCATE» порядка, чем mysql, тогда нам нужно получить другой способ ... эта функция (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(); 
} 
2

После удаления я также использую VACUUM команду.Таким образом, для полного TRUNCATE эквивалента Я использую этот код:

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

Стирания не работает для меня для сброса Auto Increment

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

Чтобы узнать больше о ВАКУУМЕ вы можете пойти здесь: https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/

Смежные вопросы