2014-09-05 53 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