有没有办法设置“到期”时间,之后在PostgreSQL中自动删除数据条目?

时间:2014-09-25 19:42:58

标签: database postgresql ttl

有没有办法在PostgreSQL的数据条目上设置某种“到期”时间?我正在考虑与EXPIRE in Redis相当的东西。

我不打算存储时间戳,然后手动编写某种cron作业,以检查哪些条目已过期。

我试图找出PostgreSQL中是否有任何提供此类功能的本机功能,或者是否有必要为将来的版本请求此类功能。

2 个答案:

答案 0 :(得分:83)

没有内置的过期功能,但如果您的目标是自动使字段过期并且逻辑中包含逻辑(因此没有外部依赖项,如cron作业),那么您始终可以编写触发器。下面是一个触发器的示例,该触发器从表中删除时间戳大于1分钟的行。只要在同一个表中插入新行,就会执行它。显然,您可以根据需要将触发器设置为在其他条件和各种到期日期执行。我使用以下网站作为基础: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 :(得分:5)

没有。没有这样的功能。

我看不出它的作用比(1)只是“过期”时间戳或(2)时间戳+ cron-job / pgAgent。

这听起来不像是添加到核心的一般功能。您可以非常简单地编写一个extension代码来处理这类事情,可以使用从cron-job调用的tick或者background-worker进程。

我在pgxn上没有看到任何内容,所以可能对它的要求不高。