Триггер MySQL. Как сохранить каждую строку данных в таблице в течение ограниченного времени?

#mysql #sql #triggers #sql-insert #sql-delete

#mysql #sql #триггеры #sql-вставка #sql-удалить

Вопрос:

В моей базе данных есть таблица, каждая строка которой должна храниться в течение ограниченного времени (1 минута). Я пытаюсь выполнить триггер ON INSERT следующим образом:

 CREATE TRIGGER `temp_data_trig` AFTER INSERT ON `tokens`
FOR EACH ROW 
BEGIN
    DO SLEEP(60);
    DELETE FROM `tokens` WHERE id = NEW.id;
END
  

Но когда я пытаюсь вставить новую строку, я получаю это:

 Can't update table 'tokens' in stored function/trigger because it is 
already used by statement which invoked this stored function/trigger.
  

Что не так с моим триггером и как правильно хранить каждую строку данных в течение ограниченного времени?

Ответ №1:

В общем, вы не хотите делать sleep в триггере. Это просто блокирует таблицу.

Я бы посоветовал вам использовать один из следующих подходов.

Первый — включить отметку даты / времени, когда что-то вставляется. Затем выполните задание, которое проходит через удаление записей старше минуты. Обратите внимание, что это создает значительную нагрузку на базу данных. В качестве альтернативы, вы могли бы просто сохранить все записи, вставляя их по желанию, и иметь представление, которое выбирает те, которые были созданы в последнюю минуту:

 create view v_table
    select *
    from table
    where createdat >= now() - interval 1 minute;
  

Окончательное решение — разделить данные на минутные интервалы. Затем вы можете удалить разделы с минимальным воздействием на производительность базы данных («минимальным» по сравнению с другими параметрами, которые могут блокировать таблицу на более длительные периоды времени).