Удалить все, кроме последних 500 строк из базы данных sqlite - PullRequest
3 голосов
/ 14 марта 2012

Мой SQL не плохой, но SQLite на iOS постоянно меня ловит.

У меня есть таблица, в которой я хочу ограничить количество строк примерно до 500, поэтому, когда он достигает точки запуска550 он удалит самые ранние 50 строк.

Он катится, поэтому со временем идентификатор не всегда начинается с одного, и пользователь может удалять строки, поэтому идентификатор не является последовательным.juliandate поле (double), но я не уверен, что это имеет смысл

DELETE FROM contents WHERE id > '0' ORDER BY id DESC LIMIT 0, 50
DELETE FROM contents ORDER BY id DESC LIMIT 0, 50

Документация говорит, что все в порядке, но не получается.Есть идеи?

Ответы [ 4 ]

5 голосов
/ 28 июня 2013

Храните последние 500 записей:

delete
from table_name
where _id not
  in (select _id
    from table_name
    order by
      _id desc
    limit 500)
2 голосов
/ 14 марта 2012

что-то в этом роде, может быть?

delete from contents where juliandate <= (
    select max(juliandate) from (
        select juliandate from contents order by juliandate limit 0, 50));

Вы можете использовать идентификатор вместо juliandate или любого другого поля, значение которого увеличивается с каждой вставкой.

1 голос
/ 14 марта 2012
DELETE FROM contents WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 50)

DESC означает 5,4,3,2,1, используйте его для удаления the freshest записей.
ASC означает 1,2,3,4,5, используйте его для удаления the earliest записей.

Вот пример:

$ sqlite3 /tmp/del_rows.sqlite3
CREATE TABLE t (id INTEGER PRIMARY KEY, value TEXT);
INSERT INTO t (value) VALUES ('a');
INSERT INTO t (value) VALUES ('b');
INSERT INTO t (value) VALUES ('c');
INSERT INTO t (value) VALUES ('d');
INSERT INTO t (value) VALUES ('e');
INSERT INTO t (value) VALUES ('f');
SELECT * FROM t;
-- 1|a
-- 2|b
-- 3|c
-- 4|d
-- 5|e
-- 6|f

-- Deleting 2 top rows:
DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 2);
SELECT * FROM t;
-- 3|c
-- 4|d
-- 5|e
-- 6|f

-- And again:
DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY id ASC LIMIT 2);
SELECT * FROM t;
-- 5|e
-- 6|f
0 голосов
/ 14 марта 2012

Попробуйте это. Это должно быть то, что вы ищете:

DELETE FROM contents WHERE id IN 
    (SELECT id FROM contents ORDER BY id LIMIT 50 ASC);

Читайте также, аналогичный вопрос: Храните только N последних записей в базе данных SQLite, отсортированных по дате

...