2014-09-24 15 views
0

我正在開發聊天應用程序。如何將數據移動到30天以前的另一個表中?

我有兩個表messagesmessage_archives這兩個表的列是一樣的。

我的messages表包含1,00,000條記錄。我想從超過30天的郵件中將記錄移至message_archives

我的代碼:

$privateMsg = mysql_query("SELECT * FROM messages WHERE created < DATE_SUB(curdate(), INTERVAL 30 DAY)"); 
if(mysql_num_rows($privateMsg)){ 
    while($getPrivateMsg=mysql_fetch_array($privateMsg)){ 
     mysql_query("INSERT INTO message_archives SET user_id='".$getPrivateMsg['user_id']."', friend_id='".$getPrivateMsg['user_id']."', message='".$getPrivateMsg['message']."', is_view='0', created='".$getPrivateMsg['created']."'"); 

     mysql_query("DELETE FROM messages WHERE id='".$getPrivateMsg['id']."'"); 
    } 
    echo "Message move to archives older than 30 days"; 
}else{ 
    echo "Error!! message not moved!!!."; 
} 

上面的代碼可以正常使用。但我需要自定義我的代碼。我需要它在單個查詢中。有沒有任何快捷方式單一查詢?

+0

如果您的意思是「單個查詢將記錄從一個表移動到另一個表」,這是不可能的;您必須將記錄插入到您的存檔表中,然後將其從郵件表中刪除。您可以做的最接近的事情是創建一個事務 – Barranka 2014-09-24 04:39:54

+0

您可以創建一個導出作業到csv/tsv文件並從消息表中刪除相應的記錄。在單獨的查詢中,您可以使用load infile選項加載完整文件。 – Logan 2014-09-24 04:54:10

+0

是的,我是第一次檢查記錄是否超過30天記錄存在與否。如果存在,則插入到message_archives表中並刪除這些記錄消息表。 – Developer 2014-09-24 04:54:32

回答

6

我建議在結果集移動它們不循環,而是隻使用單一INSERT聲明和一個DELETE聲明:

INSERT INTO message_archives (user_id, friend_id, message, is_view, created) 
SELECT user_id, user_id, message, 0, created 
FROM messages 
WHERE created < DATE_SUB(curdate(), INTERVAL 30 DAY) 

DELETE FROM messages 
WHERE created < DATE_SUB(curdate(), INTERVAL 30 DAY) 

順便說一句 - 你確定要插入user_iduser_idfriend_id字段?也許這是一個錯字。

+0

Hi @sgeddes最近我在'message_archives'表中添加了一個列名'move_date'。如何添加當前日期,而我移動記錄'消息'表到'message_archives'表? – Developer 2014-12-04 05:55:16

相關問題