2012-01-10 90 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*** 

希望这会有所帮助。