2014-09-25 3 views
51

Gibt es eine Möglichkeit, bei Dateneinträgen in PostgreSQL eine Art "Ablauf" -Zeit einzustellen? Ich denke über etwas ähnlich wie "EXPIRE" in Redis.Gibt es eine Möglichkeit, eine "Ablauf" -Zeit einzustellen, nach der ein Dateneintrag automatisch in PostgreSQL gelöscht wird?

Ich bin nicht auf der Suche nach einem Zeitstempel und dann manuell Code einer Art Cron-Job, um zu überprüfen, welche Einträge abgelaufen sind.

Ich versuche herauszufinden, ob es eine native Funktion in PostgreSQL gibt, die diese Art von Funktionalität bietet, oder ob es sinnvoll wäre, diese Funktion für zukünftige Versionen anzufordern.

+0

Es gibt war Diskussion über die postgresql Mailingliste http://www.postgresql.org/message-id/CAKe+-77Vu=wzMYSX5d06b2+q6Fi77ZwkO0aYVf8+cewVEca [email protected] – vonPetrushev

Antwort

3

Nein. Es gibt keine solche Funktion.

Ich kann nicht sehen, was es mehr als entweder (1) nur ein "abgelaufen" Zeitstempel tut oder (2) timestamp + cron-job/pgAgent.

Es klingt nicht wie eine allgemeine Funktion, die dem Kern hinzugefügt werden würde. Sie könnten ganz einfach eine extension codieren, um diese Art von Sache zu behandeln, entweder mit einem Tick, der von einem Cron-Job oder vielleicht einem background-worker-Prozess aufgerufen wird.

Ich sehe nichts auf pgxn, also vermutlich gibt es nicht viel Nachfrage für es noch.

+3

MongoDB hat eine solche Funktion und es ist ziemlich praktisch, vor allem, wenn die App horizontal auf viele Boxen skaliert ist, weil Sie einen Weg brauchen, um sicherzustellen, dass der geplante Job ausgeführt wird, aber nur auf einer der Maschinen. Ich denke, Postgres sollte es auch umsetzen. –

63

Es gibt keine integrierte Ablauffunktion, aber wenn Sie Felder automatisch ablaufen lassen und die Logik in Ihrer Datenbank enthalten möchten (und somit keine Abhängigkeit von außen wie einen Cron-Job), können Sie immer einen Trigger schreiben. Unten sehen Sie ein Beispiel für einen Trigger, der Zeilen aus einer Tabelle löscht, deren Zeitstempel älter als 1 Minute ist. Es wird ausgeführt, wenn eine neue Zeile in dieselbe Tabelle eingefügt wird. Sie können den Trigger natürlich so einstellen, dass er bei anderen Bedingungen und für verschiedene Ablaufdaten ausgeführt wird. Früher habe ich die folgende Website als Grundlage dafür: 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

Dies ist eine ausgezeichnete Antwort! : thumbsup: für Trigger. –

+0

Huh wusste nicht, Auslöser waren eine Sache, das scheint ein ausgezeichneter Anwendungsfall für sie. – Moodragonx

+0

Was ist mit dem Leistungsaufwand? – caeus