我得到了这个场景:
我在表格中有2个特定列,称为cs_start_time(Type:Datetime)
和cs_time_length(Type:int (seconds))
。
现在我想在cs_start_time + cs_time_length < NOW() (Current Datetime)
时自动删除这些行并将它们插入到另一个表中(当然应该在删除这些行之前)。
或者,当有人对这些行执行选择查询时(触发相似)
,我会处理它这甚至可以用mysql吗? (我是mysql的新手)
答案 0 :(得分:4)
您可以将MySQL event scheduler
用于此目的:
我已经模拟了您的场景,创建了数据最初保留的主表。之后,过期的数据将存档在名为archiveTable
到event scheduler
的表格中。
-- ----------------------------
-- Table structure for `maintable`
-- ----------------------------
DROP TABLE IF EXISTS `maintable`;
CREATE TABLE `maintable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cs_start_time` datetime NOT NULL,
`cs_time_length` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
-- ----------------------------
-- Records of maintable
-- ----------------------------
INSERT INTO `maintable` VALUES ('1', '2016-05-01 12:00:00', '10');
INSERT INTO `maintable` VALUES ('2', '2016-05-02 12:00:00', '5');
INSERT INTO `maintable` VALUES ('3', '2016-05-03 12:00:00', '15');
DROP TABLE IF EXISTS `archivetable`;
CREATE TABLE `archivetable` (
`id` int(11) NOT NULL,
`cs_start_time` datetime NOT NULL,
`cs_time_length` int(11) NOT NULL
);
SET GLOBAL event_scheduler = ON;
DROP EVENT IF EXISTS `archiveEvent`;
delimiter $$
CREATE EVENT `archiveEvent` ON SCHEDULE EVERY 1 MINUTE STARTS '2016-05-02 00:00:00' ON COMPLETION PRESERVE ENABLE DO
BEGIN
INSERT INTO archivetable (
id,
cs_start_time,
cs_time_length
) SELECT
MT.id,
MT.cs_start_time,
MT.cs_time_length
FROM
maintable MT
WHERE
MT.cs_start_time + INTERVAL MT.cs_time_length SECOND < NOW() ;
DELETE
FROM
maintable
WHERE
cs_start_time + INTERVAL cs_time_length SECOND < NOW() ;
END$$
delimiter ;
注意:查看事件开始时间设置为2016-05-02 00:00:00
。之后,将每隔一分钟安排一次活动。您可以根据需要在任何间隔单位中更改计划时间。
<强>建议:强>
引述我的评论:
您可以使用mysql事件调度程序来实现此目的。但我愿意 建议您可以在选择查询中过滤掉这些条目。什么是 删除这些条目的大部分,而你可以轻松绕过 这些在你的选择查询?你必须检查每一秒 调度程序是否符合要删除的条件;
答案 1 :(得分:0)
您所描述的内容看起来像是一个在时钟上运行的重复过程 - 每当&#34; now()&#34;值达到某一点,你想要执行一些动作。
实现此目的的一种方法是编写CRON作业。 Cron是Unix / Linux中的内置系统,允许您按给定的计划运行命令。例如,您可以每小时运行一个执行SQL查询的脚本(选择应移动的所有记录,移动它们并删除它们);然后将执行结果输出到日志文件以监视您的进程。