PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe uma maneira de definir um tempo de expiração, após o qual uma entrada de dados é excluída automaticamente no PostgreSQL?


Não há um recurso de expiração embutido, mas se seu objetivo é expirar campos automaticamente e ter a lógica contida em seu banco de dados (e, portanto, nenhuma dependência externa como um trabalho cron), você sempre pode escrever um gatilho. Abaixo está um exemplo de um gatilho que exclui linhas de uma tabela com um carimbo de data/hora com mais de 1 minuto. Ele é executado sempre que uma nova linha é inserida nessa mesma tabela. Obviamente, você pode definir o gatilho para ser executado em outras condições e para várias datas de vencimento, conforme necessário. Usei o seguinte site como base para isso: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)