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

Database 有没有办法设置一个“到期”时间,在该时间之后,PostgreSQL中的数据条目会自动删除?,database,postgresql,ttl,Database,Postgresql,Ttl,有没有办法设置中数据项的某种过期时间?我在想一件与之相当的事情 我不希望存储时间戳,然后手动编写某种作业来检查哪些条目已过期 我试图找出PostgreSQL中是否有任何本机功能可以提供这种功能,或者在将来的版本中请求这种功能是否有意义。没有。没有这样的功能 我看不出它除了1个过期的时间戳或者2个时间戳+cron作业/pgAgent之外还能做什么 它听起来不像是一个将被添加到核心的通用功能。您可以非常简单地编写一个代码来处理这类事情,可以从cron作业调用一个勾号,也可以是一个进程 我没有在上看到

有没有办法设置中数据项的某种过期时间?我在想一件与之相当的事情

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


我试图找出PostgreSQL中是否有任何本机功能可以提供这种功能,或者在将来的版本中请求这种功能是否有意义。

没有。没有这样的功能

我看不出它除了1个过期的时间戳或者2个时间戳+cron作业/pgAgent之外还能做什么

它听起来不像是一个将被添加到核心的通用功能。您可以非常简单地编写一个代码来处理这类事情,可以从cron作业调用一个勾号,也可以是一个进程


我没有在上看到任何内容,因此可能还没有太多的需求。

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


有人讨论过postgresql邮件列表@caeus可能取决于缓存和索引-1。恕我直言,触发器不是处理缺少的数据库功能的方法,因为触发器很难测试,很难维护,而且只是一个麻烦。请诚实地在应用程序中实现它:同意,我认为检查旧记录并在每次插入时将其删除在性能方面是非常糟糕的解决方案。例如,即使是像CRON作业脚本这样执行需要SQL的脚本也不难设置。如果有过期时间索引,性能应该相当好。Brett的解决方案是+1。对于像会话表这样只希望用户有一个会话的情况,我认为在会话表的任何插入上都有一个触发器,以确保每个用户只有一个会话,这是一个完全有效的用例。人们对某些东西是否可测试感到困扰,因此他们编写了更复杂的解决方案,然后需要进行大量测试,而不是一些简单的功能,他们可以确信这些功能不会被破坏。我知道这个答案很古老,但在我看来,这是一个非常有用的功能,例如:将此功能添加到postgresql需要大量的工作,例如,创建外键需要不同的规则。。。
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)