2014-09-05 52 views
1

我想嘗試根據另一個表中的搜索在SQL表中設置兩個值。我的查詢如下:更新超過25,000個條目的表

UPDATE $postmeta 
SET meta_key = '_bbps_topic_status', 
    meta_value = '1' 
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic' 
    ) 

我想爲25,148行整個表做到這一點,但我甚至增加了服務器上的所有限制之後,得到一個內存錯誤。我知道MySQL不允許你以500的組進行批量操作,但是有什麼方法可以編寫腳本來將這個操作分成更小的塊?

在此先感謝!

編輯:查詢包括日期範圍:

UPDATE $postmeta 
SET meta_key = '_bbps_topic_status', 
    meta_value = '1' 
    WHERE post_id IN (
    SELECT ID 
    FROM $posts 
    WHERE post_type='topic' 
    AND DATE_SUB(
     CURDATE(), 
     INTERVAL 30 DAY 
     ) <= post_date 
    ) 

回答

2

使用join方法和$postmeta表上post_id索引將有助於

UPDATE $postmeta m 
JOIN $posts p ON(p.ID = m.post_id) 
SET m.meta_key = '_bbps_topic_status', 
    m.meta_value = '1' 
WHERE p.post_type='topic' 
AND p.post_date <= NOW() - INTERVAL 30 DAY 

注意你正在使用一個子查詢這將運行的每一行,而不是使用加入也在您的日期列添加索引,以提高您的查詢性能

+0

嘿哈立德 - 我添加了一個更復雜的查詢,因爲我湊我不知道如何在你使用的JOIN命令中包含它。 – RoboRob 2014-09-05 19:31:29

+0

@RoboRob當你沒有比較這個表達式的結果時,使用'DATE_SUB'部分的目的是什麼? – 2014-09-05 19:33:35

+0

我正在嘗試獲取超過30天的類型「主題」的所有帖子。當我在SELECT語句中運行它時,它似乎按照我的意願做了。 – RoboRob 2014-09-05 19:36:23