2010-06-10 5 views
3

J'essaie de supprimer les entrées expirées dans une base de données MySQL, lors de la création ou de la mise à jour d'un champ appelé lastBeat est mis à jour avec CURRENT_TIME et j'utilise la requête suivante pour vérifier/supprimer les lignes antérieures à 20 secondes:MySQL supprimer la ligne après 'expiry'

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

J'ai aussi essayé CURRENT_TIME au lieu de NOW()

Il y a 2 boucles principales:

  1. mises à jour une ligne dans rmachines chaque seconde

  2. Exécute la requête de suppression

Si 2 est exécutée rapidement, comme le temps passe à la minute suivante (à savoir 59-60 secondes) il supprime la ligne comme si elle avait expiré (même si elle ne l'a certainement pas!), Sinon elle se comporte bien.

Si 2 s'exécute une fois par seconde ce n'est pas si perceptible, la "fausse expiration" arrive rarement mais je l'exécute 5 fois par seconde pour exposer le 'problème'.

J'ai trouvé une solution, testé et semble fonctionner dans les mêmes scénarios:

a job to delete rows older than 3 months in mysql database

Mais quelqu'un peut me dire pourquoi ma méthode ne fonctionne pas?

Répondre

7

Vous affectez NOW() à un nombre puis vous en soustrayez 20. Au lieu de cela, vous devez soustraire 20 secondes à l'aide d'un intervalle:

NOW() - interval 20 second 

La différence peut être vu ici:

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

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

Le temps 00:06:59 comparera après 00:06:49 mais avant 000689.

+0

Excellente réponse, merci. Je ne peux pas croire que j'ai négligé la possibilité de coulée, j'ai même fait SELECT MAINTENANT() - 20 et je n'ai pas remarqué! –

Questions connexes