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


107

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

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

この種の機能を提供するPostgreSQLのネイティブ機能があるかどうか、または将来のリリースでそのような機能をリクエストすることが理にかなっているかどうかを調べています。


1
PostgreSQLのメーリングリスト上の議論があったの postgresql.org/message-id/...
vonPetrushev

回答:


105

組み込みの有効期限機能はありませんが、フィールドが自動的に期限切れになり、データベース内にロジックが含まれることを目的とする場合(したがって、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)

1
@caeusはおそらくキャッシングとインデックス作成に依存しています
Nimrod

39
-1。Imho、トリガーは欠落しているデータベース機能を処理する方法ではありません。トリガーはテストが難しく、メンテナンスが難しく、お尻が痛いだけです。正直に言って、アプリケーションに実装してください。:)
Bastian Voigt

2
同意します。古いレコードをチェックし、挿入ごとに削除することは、パフォーマンスの面で本当に恐ろしい解決策だと思います。たとえば、必要なSQLを実行するCRONジョブスクリプトのようなものをセットアップすることもそれほど難しくありません。
zarkone

有効期限のインデックスがある場合、perfprmanceはかなり良いはずです。
Jasen

2
ブレットの解への+1。ユーザーに1つのセッションのみを許可するセッションテーブルのような場合、セッションテーブルへのINSERTのトリガーは、各ユーザーが1つのセッションしか持たないことを確認するために完全に有効な使用例だと思います。人々は、何かが「テスト可能」であるかどうかにこだわるので、信頼できる壊れない単純な関数ではなく、より複雑なソリューションを作成します(その場合、厳しいテストが必要になります)。
corysimmons

8

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

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

コアに追加される一般的な機能のようには聞こえません。この種のことを処理する拡張機能をコーディングするだけで、cronジョブまたはバックグラウンドワーカープロセスからティックを呼び出すことができます。

pgxnには何も表示されないため、おそらくまだそれほどの需要はありません。


3
私はこの回答が古いことを知っていますが、IMOは非常に便利な機能です。例:docs.mongodb.com/manual/core/index-ttl
Madbreaks

この機能をpostgresqlに追加するには多くの作業が必要になります。たとえば、外部キーの作成には別のルールが必要になります...
Jasen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.