Подтвердить что ты не робот

Есть ли способ установить время истечения срока действия после того, как запись данных автоматически удаляется в PostgreSQL?

Есть ли способ установить какое-то время истечения времени на записи данных в PostgreSQL? Я думаю о чем-то эквивалентном "EXPIRE" в Redis.

Я не хочу хранить временную метку, а затем вручную программировать какое-то задание cron для проверки того, какие записи истекли.

Я пытаюсь выяснить, есть ли какая-либо встроенная функция в PostgreSQL, которая обеспечивала бы такую ​​функциональность, или было бы целесообразно запросить такую ​​функцию для будущих выпусков.

4b9b3361

Ответ 1

Нет встроенной функции истечения срока действия, но если ваша цель состоит в том, чтобы автоматически истекать поля и иметь логику, содержащуюся в вашей базе данных (и, следовательно, внешнюю зависимость, например, задание 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)

Ответ 2

Нет. Такой функции нет.

Я не вижу, что он делает больше, чем либо (1), либо только временная метка "expired", либо (2) timestamp + cron-job/pgAgent.

Это не похоже на общую функцию, которая будет добавлена ​​в ядро. Вы могли бы просто закодировать extension, чтобы справиться с такими вещами: либо тик, называемый cron-job, либо, возможно, background-worker.

Я ничего не вижу на pgxn, так что, по-видимому, пока этого не было много.