2

我有一个 sqlite 数据库(在 android 上),我想在其中存储一些数据的最新 N 个条目。

表的主键是日期字段。基本上每当我在达到阈值后插入一些行时,我都想从表中删除最旧的条目。

有什么特别聪明/好的方法可以做到这一点吗?请注意,我总是在每次插入后检查不变量(nr rows <= THRESHOLD),因此我们无需处理任何事情,只需删除最旧的条目。

我打算做的基本上是:

  1. 插入数据
  2. 如果表的计数(*)<= THRESHOLD:转到 4
  3. DELETE FROM table WHERE date == (SELECT date from table order by date ASC LIMIT 1);
  4. 完毕

注意我使用的是 ORMlite,但由于不涉及用户数据,我可以只使用原始 SQL,所以应该没有问题。

4

3 回答 3

2
DELETE FROM table WHERE date = (SELECT MAX(date) from table LIMIT 1);
于 2012-04-14T22:35:22.373 回答
1

当添加新行并且行数超过您的阈值时,您可以使用触发器删除最旧的行。

行数可以保存在单独的会计表中,以避免每次插入时都有 COUNT。

这是一个完整的例子:

create table bookkeepings (bk_name text primary key, bk_value integer not null);

insert or replace into bookkeepings values ('Max Results', 50);
insert or replace into bookkeepings values ('Qty Results', 0);

create table results
  (r_timestamp text primary key default (datetime(current_timestamp)),
   result text);

create trigger results_limit_trigger before insert on results"
  for each row"
  when (select bk_value from bookkeepings where bk_name = 'Qty Results')
    >= (select bk_value from bookkeepings where bk_name = 'Max Results')
  begin
    delete from results
      where r_timestamp = (select r_timestamp from results order by r_timestamp limit 1);
  end;

create trigger results_count_insert_trigger after insert on results
  for each row
  begin
    update bookkeepings set bk_value = bk_value + 1 where bk_name = 'Qty Results';
  end;

create trigger results_count_delete_trigger after delete on results
  for each row
  begin
    update bookkeepings set bk_value = bk_value - 1 where bk_name = 'Qty Results';
  end;
于 2012-04-14T22:48:21.127 回答
1

这个怎么样?

-- keep the last N records by expiration date
declare @expDate datetime

set @expDate = (select top 100 max(dt) from table order by dt asc);
delete from table where dt > @expDate
于 2012-04-14T23:01:23.490 回答