Подтвердить что ты не робот

Перекатывание строк в таблице SQL

Я хотел бы создать таблицу SQL, которая содержит не более n строк данных. Когда новая строка вставлена, я бы хотел, чтобы самая старая строка была удалена, чтобы освободить место для нового.

Существует ли типичный способ обработки этого в SQLite?

Должен ли он управлять каким-либо внешним (сторонним) кодом?

4b9b3361

Ответ 1

Развернувшись на Alex 'answer и предположим, что у вас есть инкрементный, не повторяющийся последовательный столбец в таблице t с именем serial, который можно использовать для определения относительный возраст строк:

 CREATE TRIGGER ten_rows_only AFTER INSERT ON t
   BEGIN
     DELETE FROM t WHERE serial <= (SELECT serial FROM t ORDER BY serial DESC LIMIT 10, 1);
   END;

Это не сделает ничего, когда у вас будет менее десяти строк, и будет DELETE самый младший серийный номер, когда INSERT подталкивает вас к одиннадцати строкам.

UPDATE

Здесь немного более сложный случай, когда ваша таблица записывает "возраст" строки в столбце, который может содержать дубликаты, например столбцы TIMESTAMP, отслеживающие время вставки.

sqlite> .schema t
CREATE TABLE t (id VARCHAR(1) NOT NULL PRIMARY KEY, ts TIMESTAMP NOT NULL);
CREATE TRIGGER ten_rows_only AFTER INSERT ON t
  BEGIN
    DELETE FROM t WHERE id IN (SELECT id FROM t ORDER BY ts DESC LIMIT 10, -1);
  END;

Здесь мы считаем само собой разумеющимся, что мы не можем использовать id для определения относительного возраста, поэтому мы удаляем все после первых 10 строк, упорядоченных по метке времени. (SQLite накладывает произвольный порядок на строки, имеющие один и тот же ts).

Ответ 4

Это будет похоже на то, как вы это сделаете. Это предполагает, что my_id_column является автоматическим приращением и является столбцом упорядочения для таблицы.

-- handle rolls forward
-- deletes the oldest row
create trigger rollfwd after insert on my_table when (select count() from my_table) > max_table_size
   begin
   delete from my_table where my_id_column = (select min(my_id_column) from my_table);
   end;

-- handle rolls back
-- inserts an empty row at the position before oldest entry
-- assumes all columns option or defaulted
create trigger rollbk after delete on my_table when (select count() from my_table) < max_table_size
   begin
   insert into my_table (my_id_column) values ((select min(my_id_column) from my_table) - 1);
   end;