トリガーのみを使用して解決策を実行できました。この例では、カテゴリごとに最大 3 つのアイテムの制限を適用し、タイムスタンプを使用して最も古いアイテムを特定し、破棄します。
CREATE TABLE mytable (category, item, timestamp);
CREATE TABLE mytable_counts (category UNIQUE, items_count);
CREATE TRIGGER update_mytable_counts AFTER INSERT ON mytable
BEGIN
UPDATE mytable_counts
SET items_count = items_count + 1
WHERE category = NEW.category;
INSERT OR IGNORE INTO mytable_counts VALUES(NEW.category, 1);
END;
CREATE TRIGGER enforce_limit AFTER UPDATE ON mytable_counts WHEN NEW.items_count > 3
BEGIN
DELETE FROM mytable WHERE category=NEW.category AND timestamp NOT IN (SELECT timestamp FROM mytable WHERE category=NEW.category ORDER BY timestamp DESC LIMIT 3);
UPDATE mytable_counts SET items_count = 3 WHERE ROWID=NEW.ROWID;
END;
私はコードの最適化を試みていません。また、より大きなテーブルでどのように実行されるかわかりません。