テーブルが最大レコード数に達したときにN(古いフィルタ、または少なくともフィルタを満たすライン)行を削除するには、sqlite3でトリガを追加できますか? ?はいの場合、どうですか?sqlite、テーブルが最大レコード数に達したときのトリガー
単純な例:ログデータベースには、最大1000個のエントリが含まれています。 1000番目のエントリが挿入されると、 最初の100個は削除されます。そうすることで、一定のサイズに達した後にラップすることができます。
Rings a bell?ここで
テーブルが最大レコード数に達したときにN(古いフィルタ、または少なくともフィルタを満たすライン)行を削除するには、sqlite3でトリガを追加できますか? ?はいの場合、どうですか?sqlite、テーブルが最大レコード数に達したときのトリガー
単純な例:ログデータベースには、最大1000個のエントリが含まれています。 1000番目のエントリが挿入されると、 最初の100個は削除されます。そうすることで、一定のサイズに達した後にラップすることができます。
Rings a bell?ここで
は、あなたが100行を削除するlimit 100
にlimit 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;
という名前のヘルパー表を使用して私のために働いた何か。
必要に応じて 'Qty Entries'を計算できませんか? ( 'SELECT COUNT(*)from log_entries'?) – pilcrow
@pilcrowもちろん、COUNT(*)を使うことができますが、これはO(N)の操作であり、挿入するたびにそのコストがかかりません。 –
可能な重複:[SQLテーブルのローリング行](http://stackoverflow.com/q/1977341/132382) – pilcrow