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

Pen*_*ica 86 database postgresql ttl

有没有办法在PostgreSQL中的数据条目上设置某种"到期"时间?我正在考虑与EXPIRERedis相同的东西.

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

我试图找出PostgreSQL中是否有任何本机功能可以提供这种功能,或者是否有必要为将来的版本请求这样的功能.

Bre*_*ato 89

没有内置的过期功能,但如果您的目标是自动使字段过期并且逻辑中包含逻辑(因此没有像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)
Run Code Online (Sandbox Code Playgroud)

  • -1.Imho,触发器不是你应该处理丢失的数据库功能的方式,因为触发器很难测试,难以维护,只是痛苦的屁股.要诚实,并在您的应用程序中实现它.:) (31认同)
  • 布雷特的解决方案+1。对于像会话表这样的东西,您只希望用户有一个会话,我认为对会话表的任何插入的触发器,以确保每个用户只有一个会话,是一个完全有效的用例。人们痴迷于某些东西是否“可测试”,因此他们编写更复杂的解决方案(然后_需要_大量测试),而不是一些他们可以确信不会破坏的简单函数。 (5认同)
  • 同意,我认为检查旧记录并在每次插入时将其删除在性能方面确实是一个糟糕的解决方案。例如,即使执行诸如CRON作业脚本之类的需要SQL的程序,设置起来也不难。 (2认同)

Ric*_*ton 7

否。没有这样的功能。

我看不到它比(1)仅是“过期”时间戳或(2)时间戳+ cron-job / pgAgent所能做的更多。

听起来不像是要添加到核心的一般功能。您可以很简单地编写一个扩展程序来处理这种事情,既可以通过cron-job调用,也可以通过背景工作进程调用。

我在pgxn上什么都看不到,所以大概没有太多需求。

  • 我知道这个答案很旧,但在我看来,这是一个非常有用的功能,例如:https://docs.mongodb.com/manual/core/index-ttl/ (5认同)