web-dev-qa-db-ja.com

「有効期限」時間を設定する方法はありますか?その後、PostgreSQLでデータエントリが自動的に削除されますか?

PostgreSQL のデータエントリにある種の「有効期限」時間を設定する方法はありますか? RedisのEXPIRE と同等のものを考えています。

タイムスタンプを保存してから、何らかのエントリ cron jobを手動でコーディングして、どのエントリが期限切れになっているかを確認するつもりはありません。

この種の機能を提供するPostgreSQLのネイティブ機能があるかどうか、または将来のリリースでそのような機能を要求する意味があるかどうかを確認しようとしています。

80
Pensierinmusica

組み込みの有効期限機能はありませんが、フィールドが自動的に期限切れになり、データベース内にロジックが含まれることが目的の場合(したがって、cronジョブのような外部依存関係はありません)、いつでもトリガーを作成できます。以下は、1分以上前のタイムスタンプを持つテーブルから行を削除するトリガーの例です。同じ行が新しいテーブルに挿入されるたびに実行されます。他の条件で、また必要に応じてさまざまな有効期限で実行するようにトリガーを設定できます。この基礎として次のWebサイトを使用しました。 http://www.the-art-of-web.com/sql/trigger-delete-old/

CREATE TABLE expire_table (
    timestamp timestamp NOT NULL DEFAULT NOW(),
    name TEXT NOT NULL
);

INSERT INTO expire_table (name) VALUES ('a');
INSERT INTO expire_table (name) VALUES ('b');
INSERT INTO expire_table (name) VALUES ('c');

select * from expire_table;
         timestamp          | name 
----------------------------+------
 2014-09-26 15:33:43.243356 | a
 2014-09-26 15:33:45.222202 | b
 2014-09-26 15:33:47.347131 | c
(3 rows)

CREATE FUNCTION expire_table_delete_old_rows() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
  DELETE FROM expire_table WHERE timestamp < NOW() - INTERVAL '1 minute';
  RETURN NEW;
END;
$$;

CREATE TRIGGER expire_table_delete_old_rows_trigger
    AFTER INSERT ON expire_table
    EXECUTE PROCEDURE expire_table_delete_old_rows();

INSERT INTO expire_table (name) VALUES ('d');

select * from expire_table;
         timestamp          | name 
----------------------------+------
 2014-09-26 15:36:56.132596 | d
(1 row)
86
Brett DiDonato

いいえ。そのような機能はありません。

(1)単に「期限切れの」タイムスタンプがするか、(2)タイムスタンプ+ cron-job/pgAgentのどちらよりも、それが何をするのかわかりません。

コアに追加される一般的な機能とは思えません。 extension をコーディングするだけで、このようなことを処理できます。cronジョブから呼び出される目盛りか、おそらく background-worker プロセスです。

pgxn には何も表示されないので、おそらくあまり需要がありません。

6
Richard Huxton