String ALTER_TBL ="delete from " + MYDATABASE_TABLE +
" where "+KEY_ID+" in (select "+ KEY_ID +" from "+ MYDATABASE_TABLE+" order by _id LIMIT 3);";
- в sqlite нет команды "top 3", о которой я знаю, вы должны добавить ограничение
- , когда вы добавляете строки вместе, следите за пробелами:
"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 th в M th строка Предложение 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 есть опция для включения части ORDER BY x LIMIT n
непосредственно в операторе DELETE
без подзапроса.Эта опция не включена в Android и не может быть активирована, но это может быть интересно тем, кто использует SQLite в других системах:
DELETE FROM table_name ORDER BY sort_column LIMIT 3