Is there a way to set an “expiry” time, after which a data entry is automatically deleted in PostgreSQL?

前端 未结 2 1493
北荒
北荒 2020-12-12 12:40

Is there any way to set some sort of \"expiry\" time on data entries in PostgreSQL? I\'m thinking about something equivalent to EXPIRE in Redis.

I\'m not looking to

相关标签:
2条回答
  • 2020-12-12 13:14

    No. There is no such feature.

    I can't see what it does more than either (1) just an "expired" timestamp does or (2) timestamp + cron-job/pgAgent.

    It doesn't sound like a general feature that would be added to the core. You could quite simply code an extension to handle this sort of thing, with either a tick called from a cron-job or perhaps a background-worker process.

    I don't see anything on pgxn, so presumably there's not been much demand for it yet.

    0 讨论(0)
  • 2020-12-12 13:30

    There is no built in expiration feature but if your goal is to automatically expire fields and have the logic contained within your database (and thus no outside dependency like a cron job) then you can always write a trigger. Below is an example of a trigger that deletes rows from a table that have a timestamp of older than 1 minute. It is executed whenever a new row is inserted into that same table. You can obviously set the trigger to execute on other conditions and for various expiration dates as need be. I used the following website as a basis for this: 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)
    
    0 讨论(0)
提交回复
热议问题