2

一部のデータの最新の N エントリを保存する sqlite データベース (Android 上) があります。

テーブルの主キーは日付フィールドです。基本的に、しきい値に達した後に行を挿入するたびに、テーブルから最も古いエントリを削除したいと考えています。

これを行うための特に賢い/良い方法はありますか? 各挿入後に常に不変式 (nr 行 <= THRESHOLD) をチェックすることに注意してください。したがって、最も古いエントリを削除する以外は何も処理する必要はありません。

私がやろうとしていることは、基本的に次のとおりです。

  1. データを挿入する
  2. テーブルのカウント(*) <= THRESHOLDの場合: goto 4
  3. DELETE FROM table WHERE 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 に答える