有没有一种设置“到期”时间的方法,此后在PostgreSQL中自动删除数据条目?


107

有什么方法可以在PostgreSQL中的数据条目上设置某种“到期”时间?我正在考虑与EXPIRERedis等效的东西。

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

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


1
还有的是在PostgreSQL的邮件列表讨论 postgresql.org/message-id/...
vonPetrushev

Answers:


105

没有内置的到期功能,但是如果您的目标是自动使字段到期并在数据库中包含逻辑(因此没有像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
@caeus可能取决于缓存和索引编制
Nimrod

39
-1。恕我直言,触发器不是应对缺少的数据库功能的方法,因为触发器很难测试,难以维护并且只会让人感到痛苦。老实说,并在您的应用程序中实现它。:)
Bastian Voigt

2
同意,我认为检查旧记录并在每次插入时将其删除在性能方面确实是一个糟糕的解决方案。例如,即使执行诸如需要执行SQL的CRON作业脚本之类的设置,也并不难。
zarkone

如果有到期时间的索引,性能应该相当不错。
Jasen

2
+1 Brett的解决方案。对于像会话表这样的东西,您只希望一个用户拥有一个会话,我认为对会话表进行任何INSERT操作以确保每个用户只有一个会话是一个完美的用例。人们会着迷于某些东西是否“可测试”,因此他们编写了更复杂的解决方案(然后需要进行大量测试),而不是他们可以确定不会破坏的一些简单功能。
corysimmons

8

否。没有此类功能。

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

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

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


3
我知道这个答案很旧,但是IMO是一个非常有用的功能,例如:docs.mongodb.com/manual/core/index-ttl
Madbreaks

要将此功能添加到postgresql中,将需要大量的工作,例如,外键的创建将需要不同的规则...
Jasen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.