MySQL удалить строку после истечения срока действия - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь удалить просроченные записи в базе данных MySQL, при создании или обновлении поле с именем lastBeat обновляется с помощью CURRENT_TIME, и я использую следующий запрос для проверки / удаления строк старше 20 секунд:

DELETE * FROM `rmachines` WHERE
 `lastBeat` < (NOW() - 20);

Я также попробовал CURRENT_TIME вместо NOW ()

Есть 2 основных цикла:

  1. Обновляет строку в rmachines каждую секунду

  2. Выполняет запрос на удаление

Если 2 выполняется быстро, когда время переносится на следующую минуту (т. Е. 59-60 секунд), он удаляет строку, как будто срок ее действия истек (даже если он определенно не имеет!), В противном случае он ведет себя нормально.

Если 2 выполняется раз в секунду, это не так заметно, «ложное истечение» происходит редко, но я запускаю его 5 раз в секунду, чтобы выявить «проблему».

Я нашел решение, протестировал и, кажется, работает в тех же сценариях:

задание по удалению строк старше 3 месяцев в базе данных mysql

Но кто-нибудь может сказать мне, почему мой метод не работает?

1 Ответ

7 голосов
/ 11 июня 2010

Вы применяете NOW () к числу, а затем вычитаете из него 20.Вместо этого вы должны вычесть 20 секунд, используя интервал:

NOW() - interval 20 second

Здесь можно увидеть разницу:

SELECT NOW() - interval 20 second, NOW() - 20;

2010-06-11 00:06:49, 20100611000689.000000
                 ^^              ^^

Время 00:06:59 будет сравниваться после 00:06:49, но до 000689.

...