2012-01-10 43 views
0

我已經在表1進行修改保存數據該臨時表更新表中的數據,以更新表1我使用查詢:我想通過批量

UPDATE table1 pr 
INNER JOIN tmpTable tmp 
ON (pr.product_id = tmp.product_id) 
SET pr.isactive = tmp.isactive 

但由於tmpTable持有大量的數據更新,我的查詢有時會結束到'超時'。所以我的問題是,基本上按批次更新數據的最簡單方法是什麼?比如說10K。

在此先感謝!

+0

10K似乎不是很多數據。你檢查過你的索引嗎?確保兩個表上的'product_id'是相同的數據類型,具有相同的長度並被索引。這可能有幫助。 – 2012-01-10 04:27:37

+0

嗨艾曼,其實我只是用10K作爲例子,我可以批量更新表格的行數。比方說,更新4M數據10K。 – 2012-01-10 04:40:38

回答

1

你在PHP中標記了這個,所以我假設你願意在那裏做一些工作,而不僅僅是在一個查詢中。多次運行查詢。像

for($i<$minId; $i<maxId;$i+=10000){ 

    $db->query("UPDATE table1 pr 
    INNER JOIN tmpTable tmp 
    ON (pr.product_id = tmp.product_id) 
    SET pr.isactive = tmp.isactive where isactive between $i and $i+10000"); 

} 

的東西,如果你正在運行的MyISAM你的風險的事情這樣或那樣你結束了在部分完成的狀態。如果你正在運行innodb並且想維護一個事務的全部或者全部規範,你必須將這個循環包裝在一個開始/提交中。但是,那麼你將會面對潛在的過度大規模交易的影響。

如果你能提供更多關於你的細節的細節,我可以更深入地瞭解這條路線。

0

使用WHERE子句限制數據 - 如何使用當前提供的信息來格式化無法回答的地方。

1

您可以通過在臨時表中使用主鍵或標識鍵和UPDATE語句中的WHERE子句來限制記錄數。例如:

UPDATE table1 pr 
INNER JOIN tmpTable tmp 
ON (pr.product_id = tmp.product_id) 
SET pr.isactive = tmp.isactive ***WHERE tmp.ID BETWEEN 1 and 10000*** 

希望這會有所幫助。