Java 在表中保留最新的n个条目

Java 在表中保留最新的n个条目,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我在android上有一个sqlite数据库,我想在其中存储一些数据的最新N个条目 表的主键是日期字段。基本上,每当我在达到阈值后插入一些行时,我都希望从表中删除最旧的条目 有什么特别聪明/好的方法可以做到这一点吗?请注意,我总是检查不变的nr行当添加新行时,您可以使用触发器删除最旧的行,并且行数超过阈值 行数可以保存在单独的记帐表中,以避免每次插入时都进行计数 下面是一个完整的示例: create table bookkeepings (bk_name text primary key, bk

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

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


有什么特别聪明/好的方法可以做到这一点吗?请注意,我总是检查不变的nr行当添加新行时,您可以使用触发器删除最旧的行,并且行数超过阈值

行数可以保存在单独的记帐表中,以避免每次插入时都进行计数

下面是一个完整的示例:

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;

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

行数可以保存在单独的记帐表中,以避免每次插入时都进行计数

下面是一个完整的示例:

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;
这个怎么样

-- 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
这个怎么样

-- 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

这是否违反了单值子查询规则?3.从表中删除,其中日期==从表中按日期顺序选择日期ASC@克里斯,那里至少应该有一个限制1是的。但它应该被视为伪代码——我还在考虑如何最好地实现它——我只是认为一些代码会让它更容易理解。这不违反单值子查询规则吗?3.从表中删除,其中日期==从表中按日期顺序选择日期ASC@克里斯,那里至少应该有一个限制1是的。但它应该被视为伪代码——我仍在考虑如何最好地实现它——我只是认为一些代码会让它更容易理解。啊,MAX是个好主意,是的——意图更清晰,速度也更快。但整体结构无法改善?为此必须执行4个查询,这似乎相当迂回。为什么要插入和删除?也许是MINdatetime的更新,用新数据和当前日期时间覆盖最旧的条目?@Sam有趣的想法。从未想过更新完整的记录。可能不会比insert/delete更高效,因为我们仍然需要对表进行重新排序,但我也会尝试一下。是的,Ah MAX是一个好主意-意图更清晰,速度也更快。但整体结构无法改善?为此必须执行4个查询,这似乎相当迂回。为什么要插入和删除?也许是MINdatetime的更新,用新数据和当前日期时间覆盖最旧的条目?@Sam有趣的想法。从未想过更新完整的记录。可能不会比insert/delete更有效,因为我们仍然需要对表重新排序,但我也会尝试一下。