Усечь таблицу SQLite, если она существует?
для усечения таблицы в SQLite мне нужно использовать следующий синтаксис:
DELETE FROM someTable
но как я могу усечь таблицу, только если она существует?
к сожалению, это бросает ошибку:
DELETE FROM someTable IF EXISTS
Это тоже не работает:
DELETE IF EXISTS FROM someTable
спасибо.
8 ответов:
ИМХО, более эффективно отбросить таблицу и воссоздать ее. И да, вы можете использовать "если существует" в этом случае.
это двухэтапный процесс:
удалить все данные из этой таблицы с помощью:
Delete from TableNameзатем:
DELETE FROM SQLITE_SEQUENCE WHERE name='TableName';
просто делать
delete. Это из документации SQLite:" когда оператор WHERE опущен из инструкции DELETE и удаляемая таблица не имеет триггеров, SQLite использует оптимизацию для удаления всего содержимого таблицы без необходимости посещать каждую строку таблицы по отдельности. Эта оптимизация "усечения"делает удаление намного быстрее. До версии SQLite 3.6.5, оптимизация усечения также подразумевается, что интерфейсы sqlite3_changes() и sqlite3_total_changes() и ПРАГМА count_changes фактически не вернут количество удаленных строк. Эта проблема была исправлена в версии 3.6.5."
Я получил его на работу с:
SQLiteDatabase db= this.getWritableDatabase(); db.delete(TABLE_NAME, null, null);
SELECT name FROM sqlite_master where name = '<TABLE_NAME_HERE>'Если имя таблицы не существует, то не будет никаких записей возвращается!
вы также можете использовать
SELECT count(name) FROM sqlite_master where name = '<TABLE_NAME_HERE>'Если счетчик равен 1, значит таблица существует, в противном случае она вернет 0
после удаления я также использую . Так что для полного
TRUNCATEэквивалент я использую этот код:DELETE FROM <table>; UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '<table>'; VACUUM;удаление не работает для меня для сброса автоматического приращения
DELETE FROM "sqlite_sequence" WHERE "name"='<table>';подробнее о вакууме вы можете прочитать здесь:https://blogs.gnome.org/jnelson/2015/01/06/sqlite-vacuum-and-auto_vacuum/
к сожалению, у нас нет команды" усечь таблицу " в SQLite, но вы можете использовать SQLite
DELETEкоманда для удаления всех данных из существующей таблицы, хотя рекомендуется использоватьDROP TABLEкоманда, чтобы удалить всю таблицу и создать его вновь.
"sqllite" не имеет порядка "усечения", как в mysql, тогда мы должны получить другой способ... эта функция (reset_table) сначала удаляет все данные в таблице, а затем сбрасывает ключ автоинкремента в таблице.... теперь вы можете использовать эту функцию везде, где вы хотите...
пример :
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(); }
Comments