Усечь таблицу SQLite, если она существует? - программирование
Подтвердить что ты не робот

Усечь таблицу SQLite, если она существует?

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

DELETE FROM someTable

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

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

DELETE FROM someTable IF EXISTS

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

DELETE IF EXISTS FROM someTable

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

    Delete from TableName
    
  • Тогда:

    DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
    

Ответ 3

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

Оптимизация Truncate

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

Ответ 4

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

SQLiteDatabase db= this.getWritableDatabase();
        db.delete(TABLE_NAME, null, null);

Ответ 5

SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'

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

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

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

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

Ответ 6

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

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

Удаление для меня не работает для reset Auto Increment

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

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

Ответ 7

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

Ответ 8

"sqllite" не имеет порядка "TRUNCATE", как mysql, тогда мы должны получить другой путь... эта функция (reset_table) frist удаляет все данные в таблице, а затем reset AUTOINCREMENT key в таблице.... теперь вы можете использовать эту функцию каждый раз, когда хотите...

пример:

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();
}