有没有一种方法可以设置一个“过期”时间,过期后 PostgreSQL 中的数据条目会被自动删除?

有没有办法在 PostgreSQL中对数据条目设置某种“过期”时间?我在想类似于 在 Redis的东西。

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

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

112978 次浏览

不,没有这种特征。

除了(1)一个“过期”的时间戳或(2)时间戳 + cron-job/pgAgent 之外,我看不出它还能做什么。

这听起来不像是一个将被添加到核心的一般特性。您可以非常简单地编写一个 分机来处理这类事情,使用 cron-job 或者 背景工作者进程来调用蜱。

我在 Pgxn上没有看到任何东西,所以大概还没有太多的需求。

没有内置的过期特性,但是如果您的目标是自动过期字段并在数据库中包含逻辑(因此没有像 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)

不,PG 不会。 但是你可以通过谷歌云扳手得到这些。它有一个 SQL 接口,目前也支持 postgres 方言。