2016-10-11 20 views
1

如果原始行超過2周,我有一個cron作業可將行從一個表移動到另一個表。我正在使用Laravel。移動行保留原始ID,但允許在目標表中自動增加

這裏是時間表通話功能: 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而不是現在 - 的情況下發生的(雖然不太可能)情況,其中第一個查詢沒有發現什麼,那麼當刪除查詢運行時,從第一個查詢開始,流逝的時間意味着DID查找文章,並且它們將被刪除但不會移動。

我反映的文章archived_articles表,但在插入,自動遞增ID列,目前正在與原article.id填充。我希望將其保留在自己的專欄中,這樣就永遠不會有碰撞的風險 - 所以我在archived_articles表中添加了一個'article_id'列。

是否有使用INSERT INTO SELECT FROM語句的方式 - 而不必列出列名但在歸檔表格保存自動遞增,並在article_id的列插入article.id

不列出列的原因是,如果我們對文章表進行更改 - 這不是不可能的 - 那麼我們必須記住也要更改存檔表,否則該列將被錯過沒有錯誤提出。

+0

您在這裏使用MySQL或MS SQL Server嗎? – jarlh

+0

對不起MySQL(刪除無關標記) – DJC

+0

不應刪除查詢從文章表中刪除記錄而不是archived_articles表? – verhie

回答

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不應該在存檔表中唯一的列,只是一個索引,否則你仍然會有重複問題。

+0

大概'id'在檔案表中,然後成爲原來的文章編號,而newId是auto_inc? – DJC

+0

是的,正確的C Ivemy。 – verhie

+0

好的。所以出於興趣 - 你看到了爲什麼會有衝突的原因。由於另一個表 - 附件,使用article_id將其鏈接到文章。實際上也不希望將它們歸檔,只需在顯示歸檔文章的附件時使用歸檔表中的article_id即可。如果文章被刪除,那麼auto_increment id在任何時候都不可用,是嗎? – DJC

相關問題