我有一个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/