我正在尝试删除MySQL数据库中的过期条目,在创建或更新时,使用CURRENT_TIME更新名为lastBeat的字段,并使用以下查询来检查/删除超过20秒的行:
DELETE * FROM `rmachines` WHERE
`lastBeat` < (NOW() - 20);
我也尝试过CURRENT_TIME而不是NOW()
有两个主循环:
每秒更新rmachines中的一行
执行删除查询
如果2快速执行,当时间滚动到下一分钟(即59-60秒)时,它会删除该行,就像它已经过期一样(即使它确实没有!),否则它表现良好。< / p>
如果2执行一次,这不是那么明显,“错误到期”很少发生,但我每秒运行5次以暴露“问题”。
我找到了一个经过测试的解决方案,并且似乎在相同的情况下工作:
a job to delete rows older than 3 months in mysql database
但有谁能告诉我为什么我的方法不起作用?
答案 0 :(得分: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
之前进行比较。