3

我正在尝试删除 MySQL 数据库中的过期条目,在创建或更新名为 lastBeat 的字段时使用 CURRENT_TIME 进行更新,我使用以下查询检查/删除超过 20 秒的行:

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

我也尝试过 CURRENT_TIME 而不是 NOW()

有2个主要循环:

  1. 每秒更新 rmachines 中的一行

  2. 执行删除查询

如果 2 被快速执行,随着时间滚动到下一分钟(即 59-60 秒),它会删除该行,就好像它已经过期(即使认为它肯定没有过期!),否则它表现得很好。

如果 2 每秒执行一次,这不太明显,“假到期”很少发生,但我每秒运行 5 次以暴露“问题”。

我找到了一个解决方案,经过测试,似乎可以在相同的场景下工作:

删除 mysql 数据库中超过 3 个月的行的作业

但是谁能告诉我为什么我的方法不起作用?

4

1 回答 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

于 2010-06-10T22:10:55.623 回答