移动行,保留原始ID,但允许在目标表中自动增加


Moving rows preserving original ID but allowing auto increment in destination table

我有一个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 -以防(尽管非常不可能)发生第一次查询没有找到任何内容的情况,然后当delete查询运行时,时间流逝,因为第一次查询意味着它确实找到了文章,并且它们将被删除但不移动。

我在articles表上镜像了archived_articles表,但是在插入时,自动增量id列目前正在用原始的article.id填充。我想在它自己的列中保留这一点,这样就不会有碰撞的风险-所以我在archived_articles表中添加了一个'article_id'列。

是否有一种方法可以使用INSERT INTO SELECT FROM语句- 而不必列出列名,但保留归档表中的自动增量,并插入条目?article_id列中的Id ?

不列出列的原因是,如果我们对articles表进行了更改(这是不可能的),那么我们必须记住对归档表也进行了更改,否则将错过该列而不会引发错误。

如果在存档表中添加一个新的auto_increment列'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列,而应该是索引,否则您仍然会遇到重复的问题。