【问题标题】:MySQL, delete from multiple tables where id match and timestamp is older than current_timeMySQL,从 id 匹配且时间戳早于 current_time 的多个表中删除
【发布时间】:2014-12-19 19:13:34
【问题描述】:

嗯,我有 4 个表,我们称它们为 table1 table2 table3 和 table4。 在表 1 中,我有一个名为“时间”的列,它在更新时使用 CURRENT_TIME 进行更新。

所以我目前有这个程序从数据库中删除旧的东西:

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

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

此外,当然,所有 4 个表中都存在 id,这并不完全 100%,如果这很重要,我不知道。

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

编辑:对不起,它的 mysql!

【问题讨论】:

  • 您已经标记了“mysql”和“sql-server”……您使用的是哪种 SQL?我假设mysql?
  • 你为什么不把它们作为外键并删除级联?

标签: mysql procedure delete-row cascading-deletes


【解决方案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

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

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

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

【讨论】:

  • 这似乎正在做我想做的事,对不起,我对 sql 完全陌生。你能解释一下交易和伪代码吗?我将其粘贴在程序中还是什么? :) 感谢您的回复!
  • 嗨赫尔曼,我将编辑我的回复并提供更多解释。我是回答关于 SO 的问题的新手! :-)
  • re: 'psuedo-code' ...不,除非我猜到了您的数据库架构,否则您不能只粘贴并执行它。由于您没有提供真实的表/列名称,因此我无法提供您需要的确切查询。
  • 漂亮的回答!这真的帮助了我,我还不能投票,因为我是新的 =) 会尽快做!
【解决方案2】:

您确实必须考虑这些事情的更大影响。在规模上,删除大型事务会导致大量回滚、大量复制延迟等。如果每个子表的行数未知,那么复制延迟会很快变得非常大。回滚这样的事务将导致各种破坏。您希望包括一些限制并循环这些限制,直到受影响的行数为 0。在 TeamTam 给出的示例中,您需要确保您拥有 mysql 5.6,否则您的子查询将崩溃并烧毁服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-27
    • 2019-12-08
    • 2011-09-12
    • 2021-09-24
    • 2014-02-07
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多