17

是否有可能在 MySQL 数据库中创建一条受TTL(生存时间)选项影响的记录。

我想做一个简单的密码恢复功能,我需要存储一个激活密钥,它会在数据库中存储仅 3600 秒,然后在此之后自动删除?我知道还有很多其他方法可以实现这一点,但它们不像TTL功能的想法那么简单。

我猜 MySQL 没有这样的功能,但我只是想也许我错过了一些东西并且有吗?

4

2 回答 2

26

我刚刚发现 MySQL 5.1+ 有event schedulerMySQL Event Scheduler管理事件的调度和执行——根据调度运行的任务。

存储的例程需要 MySQL 数据库中的事件表。该表是在 MySQL 安装过程中创建的。

使用它的语法是:

CREATE EVENT
  ClearUserActivationCodes
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
DELETE FROM
  user_activation_code
WHERE code_time_stamp < NOW()
END

它非常有用,完全满足了我在不使用 cron 作业的情况下自动清表的需求。

于 2013-10-16T10:03:38.320 回答
3

就我个人而言,我会使用该选项将密钥与TIMESTAMP字段一起存储。DEFAULT CURRENT_TIMESTAMP

然后,在获取密钥时,检查时间戳。如果不到一个小时前,那么你可以继续。否则,将其视为无效并删除密钥(您还可以提供特定的错误消息,说明密钥已过期并且用户需要一个新的)。

此外,使用每天运行一次的 cron 任务来删除超过一天的密钥。如果人们从未真正输入过过期代码,这可以确保您不会得到越来越多的过期代码。

于 2013-10-05T11:56:36.043 回答