2012-03-14 4 views
2

Мой SQL не плохой, но SQLite на iOS постоянно меня ловит.Удалите все, кроме последних 500 строк из базы данных sqlite

У меня есть таблица, где я хочу ограничить количество строк примерно до 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 

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

+0

Как это терпят неудачу? Сообщение об ошибке или просто ничего не удаляет или удаляет неправильные вещи? Почему бы вам не использовать поле даты, чтобы вы могли удалить самые старые 50? –

+0

@NickBull, '1.' Sqlite3 не так много подробностей об ошибках:' Error: near "LIMIT": синтаксическая ошибка'. '2.' может не быть поля даты. –

+0

@MishaAkovantsev 1. Это сообщение об ошибке достаточно, чтобы увидеть, что есть синтаксическая ошибка, а не ошибка, заключающаяся в том, что неправильные записи удалены. 2. OP говорит: «У меня есть поле juliandate» –

ответ

1

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

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

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

+0

StackOverflow - сделать интернет более удивительным, чем порно и котят только можно - спасибо user1096188! – JulianB

+0

Это не сработало для меня, в то время как ответ thecr0w. Убедитесь, что один, если это не работает для вас. –

0

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

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

Читайте также, аналогичный вопрос: Keep only N last records in SQLite database, sorted by date

+0

Увы, нет, не уверен, почему нет, но SQLite кажется лишней фанатикой. – JulianB

+0

Вы имеете в виду сохранить последние 500 записей? – thecr0w

1
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

Это приведет к удалению n строк каждый раз, но не «Удалить все, кроме последних 500 строк». Это означает, что для хранения последних 500 записей я думаю. – thecr0w

3

Keep последние 500 записей:

delete 
from table_name 
where _id not 
    in (select _id 
    from table_name 
    order by 
     _id desc 
    limit 500) 
+1

Работает для меня, когда принятого ответа нет. Upvoting! –

+0

поздравления, но это отчасти зависит. – thecr0w

Смежные вопросы