MySQL,从id匹配且时间戳早于current_time的多个表中删除

时间:2014-10-24 00:16:17

标签: mysql procedure delete-row cascading-deletes

好吧,我有4个表,我们称之为table1 table2 table3和table4。 在table1中,我有一个名为“time”的列,在更新时使用CURRENT_TIME进行更新。

所以我现在有了这个程序从数据库中删除旧东西:

DELETE FROM `table1` WHERE `time` < (CURRENT_TIME() - INTERVAL 5 MINUTE);

这应删除table1中超过5分钟的所有更新,现在在table1,table2,table3和table4中我得到的ID与彼此相匹配将其视为员工编号,所以我如何从table1匹配它们所以我可以同时从table2,table3和table4中删除员工?

此外,如果这很重要,我不知道,它不完全是100%的id存在于所有4个表中。

旁注:有人知道WHEN程序何时运行? :P 感谢您的答复! :)

编辑:对不起,它的mysql!

2 个答案:

答案 0 :(得分:1)

假设您使用的是MySQL,请使用伪代码。请注意,我建议您将其全部包装在交易中。

START TRANSACTION
BEGIN

  SET @deleteSince = CURRENT_TIME() - INTERVAL 5 MINUTE;

  DELETE FROM table4 WHERE table1ID IN (SELECT FROM table1 WHERE time < @deleteSince
  DELETE FROM table3 WHERE table1ID IN (SELECT FROM table1 WHERE time < @deleteSince
  DELETE FROM table2 WHERE table1ID IN (SELECT FROM table1 WHERE time < @deleteSince
  DELETE FROM table1 WHERE time < @deleteSince

COMMIT

如果数据在4个DELETE语句之一之间从另一个源同时更改,我建议使用transaction来处理这种情况,这会导致数据不一致。这个link将更多地解释这个想法。

或者,您可以使用MySQL的ON DELETE CASCADE功能。这个link是如何实现它的教程。但是,您很可能需要更改数据库模式中的外键和表定义才能执行此操作。

如果我正确理解您关于何时运行程序的问题,您将需要使用MySQL Event Scheduler或设置Cron作业。

答案 1 :(得分:0)

你真的必须考虑这些事情的更大含义。在规模上,删除大型事务会导致大量回滚,大型复制延迟等。如果每个子表的行数未知,那么复制延迟可能会非常快。回滚这样的交易将导致各种各样的暴乱。您希望包含一些限制并循环超过这些限制,直到受影响的行数为0.在TeamTam给出的示例中,您要确保拥有mysql 5.6,否则您的子查询将崩溃并刻录服务器。