MySQL在“到期”后删除行

3
我正在尝试删除MySQL数据库中过期的条目。在创建或更新时,一个名为lastBeat的字段会被更新为CURRENT_TIME,然后我使用以下查询来检查/删除超过20秒的行:
DELETE * FROM `rmachines` WHERE
 `lastBeat` < (NOW() - 20);

我还尝试过使用CURRENT_TIME代替NOW()。
有两个主要的循环:
1. 每秒更新rmachines中的一行。 2. 执行删除查询。
如果2被快速执行,当时间滚动到下一分钟时(即59-60秒),它会删除该行,就好像它已经过期了(即使它肯定没有!),否则它会正常运行。
如果2每秒执行一次,这不太明显,“虚假过期”很少发生,但我每秒运行5次以暴露这个“问题”。
我找到了一个解决方案,在相同的场景下进行了测试,似乎可以正常工作: MySQL数据库中删除三个月前的行的作业 但是,有人能告诉我为什么我的方法不起作用吗?
1个回答

7
您现在将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 之前进行比较。


非常好的答案,谢谢。简直不敢相信我竟然忽略了类型转换的可能性,我甚至执行了SELECT NOW() - 20,也没有注意到! - Paul Ridgway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接