Чи є спосіб встановити час "закінчення", після якого введення даних автоматично видаляється в PostgreSQL?


107

Чи є спосіб встановити якийсь час "закінчення" для записів даних у PostgreSQL ? Я думаю про щось рівнозначне EXPIREв Redis .

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

Я намагаюся з’ясувати, чи є в PostgreSQL якась нативна функція, яка б забезпечувала такий функціонал, чи було б сенсом запитувати таку функцію для майбутніх версій.


1
Була дискусія у списку розсилки postgresql postgresql.org/message-id/…
vonPetrushev

Відповіді:


105

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

39
-1. Імхо, тригери - це не такий спосіб, як вам слід боротися з відсутніми функціями бази даних, тому що тригери важко перевірити, важко підтримувати і просто біль у дупі. Будьте чесні та впроваджуйте це у свою заявку. :)
Bastian Voigt

2
Погодьтеся, я думаю, що перевірка старих записів та видалення їх на кожній вставці - це справді жахливе рішення з точки зору продуктивності. Не так важко налаштувати навіть щось на зразок скрипту завдань CRON, для виконання якого потрібен, наприклад, SQL.
зарконе

perfprmance повинен бути досить хорошим, якщо є індекс часу закінчення.
Ясен

2
+1 до рішення Бретта. Щось на зразок таблиці сеансів, де ви хотіли б, щоб користувач мав один сеанс, я думаю, що тригер на будь-якому ВСТУПНЕННІ до таблиці сеансів, щоб переконатися, що кожен користувач має лише один сеанс, є абсолютно правильним випадком використання . Люди одержимі, якщо щось є "перевіреним", тому вони пишуть більш складні рішення (які тоді потребують важкого тестування), а не якась проста функція, яку вони можуть бути впевнені, не зламаються.
corysimmons

8

Ні. Такої особливості немає.

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

Це не звучить як загальна функція, яка буде додана до ядра. Ви можете просто зашифрувати розширення, щоб обробити подібні речі, або з галочкою, що викликається з роботи з cron, або, можливо, з фоновим робочим процесом.

Я нічого не бачу на pgxn , тому, мабуть, ще не було великого попиту на нього.


3
Я знаю, що ця відповідь стара, але IMO це неймовірно корисна функція, наприклад: docs.mongodb.com/manual/core/index-ttl
Madbreaks

знадобиться багато роботи, щоб додати цю функцію до postgresql, наприклад, для створення зовнішнього ключа потрібні різні правила ...
Ясен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.