Обрезать таблицу SQLite, если она существует? - PullRequest
53 голосов
/ 25 ноября 2010

Чтобы усечь таблицу в SQLite, мне нужно использовать этот синтаксис:

DELETE FROM someTable

Но как мне обрезать таблицу, только если она существует?

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

DELETE FROM someTable IF EXISTS

Это тоже не работает:

DELETE IF EXISTS FROM someTable

Спасибо.

Ответы [ 8 ]

56 голосов
/ 07 января 2013

Это двухэтапный процесс:

  1. Удалить все данные из этой таблицы, используя:

    Delete from TableName
    
  2. Тогда:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    
43 голосов
/ 18 января 2013

Просто сделай delete.Это из документации SQLite:

Оптимизация усечения

"Когда WHERE опущен в операторе DELETE, а удаляемая таблица не имеет триггеровSQLite использует оптимизацию для удаления всего содержимого таблицы без необходимости отдельного посещения каждой строки таблицы. Эта «усеченная» оптимизация делает удаление намного быстрее. До SQLite версии 3.6.5 оптимизация усечения также означала, что sqlite3_changes () и интерфейсы sqlite3_total_changes () и прагма count_changes фактически не будут возвращать количество удаленных строк. Эта проблема была исправлена ​​в версии 3.6.5. "

43 голосов
/ 25 ноября 2010

ИМХО, более эффективно отбросить таблицу и воссоздать ее.И да, в этом случае вы можете использовать «ЕСЛИ СУЩЕСТВУЕТ».

8 голосов
/ 07 марта 2012

Я получил его для работы:

SQLiteDatabase db= this.getWritableDatabase();
        db.delete(TABLE_NAME, null, null);
7 голосов
/ 26 ноября 2010
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'

Если имя таблицы не существует, никаких записей не будет возвращено!

Вы также можете использовать

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

, если счет равен 1означает, что таблица существует, в противном случае она вернет 0

4 голосов
/ 21 октября 2015

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

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

Удаление не работает для сброса Автоинкремент

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

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

0 голосов
/ 18 октября 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...