2011-12-06 33 views
2

テーブルが最大レコード数に達したときにN(古いフィルタ、または少なくともフィルタを満たすライン)行を削除するには、sqlite3でトリガを追加できますか? ?はいの場合、どうですか?sqlite、テーブルが最大レコード数に達したときのトリガー

単純な例:ログデータベースには、最大1000個のエントリが含まれています。 1000番目のエントリが挿入されると、 最初の100個は削除されます。そうすることで、一定のサイズに達した後にラップすることができます。

Rings a bell?ここで

+0

可能な重複:[SQLテーブルのローリング行](http://stackoverflow.com/q/1977341/132382) – pilcrow

答えて

2

は、あなたが100行を削除するlimit 100limit 1を変えることができるbookkeepings

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

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

create trigger log_entries_limit_trigger before insert on log_entries 
    for each row 
    when (select bk_value from bookkeepings where bk_name = 'Qty Entries') 
    >= (select bk_value from bookkeepings where bk_name = 'Max Entries') 
    begin 
    delete from log_entries 
     where timestamp = (select timestamp from log_entries order by timestamp limit 1); 
    end; 

create trigger log_entries_count_insert_trigger after insert on log_entries 
    for each row 
    begin 
    update bookkeepings set bk_value = bk_value + 1 where bk_name = 'Qty Entries'; 
    end; 

create trigger log_entries_count_delete_trigger after delete on log_entries 
    for each row 
    begin 
    update bookkeepings set bk_value = bk_value - 1 where bk_name = 'Qty Entries'; 
    end; 

という名前のヘルパー表を使用して私のために働いた何か。

+0

必要に応じて 'Qty Entries'を計算できませんか? ( 'SELECT COUNT(*)from log_entries'?) – pilcrow

+1

@pilcrowもちろん、COUNT(*)を使うことができますが、これはO(N)の操作であり、挿入するたびにそのコストがかかりません。 –

関連する問題