我有一个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列,而应该是索引,否则您仍然会遇到重复的问题。