2014-09-25 70 views
51

有沒有辦法在PostgreSQL的數據項上設置某種「過期」時間?我正在考慮相當於"EXPIRE" in Redis的東西。有沒有辦法在PostgreSQL中自動刪除數據輸入後設置「到期」時間?

我不希望存儲時間戳,然後手工編碼某種cron作業的檢查什麼項目已經過期。

我試圖找出是否有在PostgreSQL的任何本地的功能,可以提供這種功能,或者如果它將使意義請求這些功能在未來發布。

+0

有是PostgreSQL的郵件列表上的討論 http://www.postgresql.org/message-id/CAKe+-77Vu=wzMYSX5d06b2+q6Fi77ZwkO0aYVf8+cewVEca [email protected] – vonPetrushev 2015-06-30 15:00:17

回答

3

不。沒有這樣的功能。

我無法看到它做什麼超過:(1)只是一個「過期」時間戳確實或者(2)日期+的cron作業/ pgAgent。

這聽起來並不像將被添加到核心的一般特徵。你可以很簡單地編寫一個extension來處理這類事情,或者從cron-job調用一個tick或者一個background-worker進程。

我沒有看到pgxn什麼,所以可能有一定不是因爲它更需要呢。

+3

MongoDB具有這樣的功能,它非常方便,特別是如果應用程序橫向縮放到多個框,因爲您需要一種方法來確保預定的作業運行,但只能在其中一個機器。我認爲postgres也應該實現它。 – 2017-04-20 15:10:58

63

沒有內置的過期的功能,但如果你的目標是自動失效領域,並有邏輯包含在您的數據庫中(從而相似的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

這是一個很好的答案! :thumbsup:用於觸發器。 – 2016-01-09 19:57:47

+0

他不知道觸發器是一件事情,這似乎是一個很好的用例。 – Moodragonx 2016-11-19 00:12:40

+0

性能開銷如何? – caeus 2016-11-28 18:06:29

相關問題