一旦行为45分钟,我想从表new_data中删除一个表行,然后将其输入另一个名为old_data的表中。
我能想到这个工作的唯一方法,它查询数据库让我们说每分钟并删除任何行(current_time - 插入的时间)> 45分钟。
还有其他办法吗?如果不是我怎么能设置一个表来记录inserted_time?
如何编写此语句以将正确的数据检索到old_data表
SELECT * FROM new_spots WHERE (NOW()-created_at)>45mins
然后将上述内容插入old_data表
答案 0 :(得分:1)
您可以在插入时指定时间列的值:
INSERT INTO x (created_at) VALUES (NOW());
另外,您可以设置VIEW
以仅显示最近的条目。
答案 1 :(得分:1)
你要求某种auto expiration
功能,它没有内置到mysql中。 Memcached提供此功能。因此,实现目标可能更清晰:
将数据插入系统时,您可以:
created_at
列的old_data表中 - 如果您需要在memcached重新启动或其他问题时重建memcached。所以每次你只需要从memcached获取新数据 - 作为副作用,它比从mysql获取数据更快:)。
答案 2 :(得分:0)
我认为没有一种自动方法可以做到这一点。以下是一些不同的想法。
我有一个类似的场景,我们需要将数据从一个表聚合到另一个表。通过CRON运行的简单命令行工具就足够了。我们每秒都会在Web服务器中收到一些消息,每个消息都会导致数据库插入。因此,数量不是很大,但它们与您的情景相似[/ p>]
我们使用NOW()函数记录插入时间,在记录为1小时后,我们处理它们。这不是一个小时,但它足够好。您可以在下面看到created_on字段。
CREATE TABLE glossaries (
id int(11) NOT NULL auto_increment,
# Our stuff ...
created_on datetime default NULL,
KEY owner_id (owner_id),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
或者,您可以使用数据库触发器来启动处理。你仍然需要一些预定的东西来触发触发器,但你会得到最大的性能/
克里斯
答案 3 :(得分:0)
@keymone向您展示了如何捕获插入时间。然后,定期(每分钟似乎过度 - 每5分钟?15分钟?)通过并构建符合条件的列表,并为每个条目插入第二个表并从第一个表中删除。