String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
" where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
- нет команды «топ 3» в SQLite Я знаю, вы должны добавить ограничение
- следить за пространства при добавлении строки вместе:
"delete from" + TABLE + "where" = "delete frommytablewhere"
Этот подход использует два шага для удаления первых N строк.
Найти первые N строк:
SELECT id_column FROM table_name ORDER BY id_column LIMIT 3
В результате список идентификаторов, которые представляют первую N (здесь: 3) строк. Часть ORDER BY
важна, поскольку SQLite не гарантирует никакого заказа без этого предложения. Без ORDER BY
оператор может удалить 3 случайные строки.
Удалить все строки из таблицы, которая соответствует списку идентификаторов:
DELETE FROM table_name WHERE id_column IN ({Result of step 1})
Если результат с шага 1 пусто ничего не случится, если есть меньше, чем N строки только они будут удален.
Важно отметить, что id_column
должен быть уникальным, иначе размер строк будет удален. Если столбец, который используется для заказа, не является уникальным, весь оператор можно изменить на DELETE FROM table_name WHERE unique_column IN (SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3)
. Подсказка: SQLite ROWID
является хорошим кандидатом для unique_column
при удалении по таблицам (может не работать при удалении по просмотрам - не уверен здесь).
Чтобы удалить последние N строк порядок сортировки должен быть обратным по убыванию (DESC
):
DELETE FROM table_name WHERE unique_column IN (
SELECT unique_column FROM table_name ORDER BY sort_column DESC LIMIT 3
)
Для удаления N й М й строки в LIMIT
может быть увеличена на OFFSET
. Пример ниже будет пропустить первые 2 строки и возврата/удалить следующий 3.
SELECT unique_column FROM table_name ORDER BY sort_column LIMIT 3 OFFSET 2
Установка LIMIT
на отрицательное значение (например,LIMIT -1 OFFSET 2
) возвращает все строки, кроме первых 2 приводит к удалению всего, кроме первых 2-х строк - это также может быть достигнуто путем поворота SELECT .. WHERE .. IN()
в SELECT .. WHERE .. NOT IN()
SQLite имеет option для того, чтобы ORDER BY x LIMIT n
непосредственное участие в оператор DELETE
без подзапроса. Эта опция не включена на Android и не может быть активирована, но это может представлять интерес для людей, использующих SQLite на других системах:
DELETE FROM table_name ORDER BY sort_column LIMIT 3
вы не можете использовать ВЕЬЕТЕ с выбора оператора в одном запросе. – Lucifer
@ Lucifer на самом деле вы можете. Но вы не можете поместить удаление внутри выделения. см. http://www.sqlite.org/lang_expr.html выражение - это часть, которую вы можете положить после «где» – zapl