移动行保留原始ID但允许在目标表

时间:2016-10-11 09:20:47

标签: php mysql sql laravel

我有一个cron作业,如果原始行超过2周,则会将行从一个表移动到另一个表。我正在使用Laravel。

这是日程调用功能: 的 kernel.php

$schedule->call(function() {

    try {

        DB::transaction(function () {

            $to_move = DB::INSERT("INSERT INTO archived_articles
                               SELECT * FROM articles 
                               WHERE progress = ?
                               AND DATEDIFF(CURDATE(), publish_date) > ?"
                               , ['2', '14']);

            if ($to_move) {
                $deleted = DB::DELETE("DELETE FROM articles
                               WHERE progress = ?
                               AND DATEDIFF(CURDATE(), publish_date) > ?"
                               , ['2', '14']);

                if ($deleted) {
                    Logging::logCronSuccess("{$deleted} articles archived");
                } else {
                    Logging::logCronSuccess("No articles archived");
                }
            }

        });

    } catch (\Exception $e) {
        Logging::logCronError($e, 'Cron error archiving articles');
    }

})->dailyAt('00:05');

我使用了CURDATE而不是NOW - 如果第一个查询没有找到任何东西(尽管非常不可能),那么当删除查询运行时,自第一个查询以来经过的时间意味着它找不到文章,它们会被删除但不会移动。

我在文章表上镜像了 archived_articles 表,但在插页上,当前正在使用原始 article.id填充自动增量ID列即可。我想将它保留在它自己的专栏中,这样就不会有碰撞的风险 - 所以我在 archived_articles 中添加了一个' article_id '列表

有没有办法使用INSERT INTO SELECT FROM语句 - 而不必列出列名 ,但保留了归档表中的自动增量,并插入了article_id栏中的article.id?

不列出列的原因是我们对articles表进行了更改 - 这不是不可能的 - 我们必须记住也要对存档表进行更改,否则该列将被遗漏为no提出错误。

1 个答案:

答案 0 :(得分:1)

如果您将新的auto_incrementing列'newID'添加到存档表,您可以像这样插入数据:

$to_move = DB::INSERT("INSERT INTO archived_articles
                           SELECT NULL as newID, * FROM articles 
                           WHERE progress = ?
                           AND DATEDIFF(CURDATE(), publish_date) > ?"
                           , ['2', '14']);

您的原始ID不应该是归档表中的UNIQUE列,只是索引,否则您仍然会遇到重复的问题。