我有一个cron作业,如果原始行超过2周,它会将行从一个表移动到另一个表。我在用拉维。
下面是schedule调用函数:
内核.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,以防(尽管可能性很小)出现第一个查询找不到任何内容的情况,然后当delete查询运行时,从第一个查询意味着它确实找到了文章开始的时间就过去了,它们将被删除但不会移动。
我在article s表上镜像了存档的文章表,但是在insert中,auto increment I d列当前正在填充原始的article.id。我想将其保存在自己的列中,这样就不会有冲突的风险-所以我在存档的文章表中添加了一个article\u id列。
有没有一种方法可以使用INSERT in to SELECT FROM语句—不必列出列名,但在存档表中保留自动增量,并在article_id列中插入article.id?
不列出列的原因是,如果我们对articles表进行了更改(这是不太可能的),那么我们必须记住也对archive表进行了更改,否则该列将丢失,并且不会出现任何错误。

最佳答案

如果将新的自动递增列“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不应该是存档表中唯一的列,而应该只是索引,否则您仍然会遇到重复的问题。

关于php - 移动保留原始ID但允许在目标表中自动递增的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39974091/

10-13 02:32
查看更多