我有一个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提出错误。
答案 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列,只是索引,否则您仍然会遇到重复的问题。