我在一个数据库中有两个表,它们被清空并经常更换。每个表都有超过65,000行。我想从第一个表中选择两个字段( LnsPriceUpdates ),然后获取这些值并进行比较并将它们插入到第二个表( LnsCatalog )中,并希望这样做数据库中的所有65,000个项目。
(注意:我想从本地主机执行所有这些操作)
这是我目前使用的代码:
public function testbananaAction()
{
$em = $this->getDoctrine()->getManager();
$query = $em
->createQuery(
'SELECT l.partnumber, l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL'
)
->getResult();
foreach ($query as $row){
$partNo = $row['partnumber'];
$part = $em->getRepository('AppBundle:Lnscatalog')
->findOneBy(['partnoid' => $partNo]);
$dealerCost = $row['level1Net'];
if(isset($dealerCost) && isset($part)){
$partCheck = $part->getDealerCost();
if(!isset($partCheck)){
$part->setDealerCost($dealerCost);
$em->flush();
}
} else {
continue;
}
}
return new Response('yay');
}
任何完成此任务而不崩溃的想法都会有所帮助。
答案 0 :(得分:0)
您可以使用单个Sql Update实现:
update Lnscatalog c
set c.dealerCost = (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
where c.dealerCost is null
and exists (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)
您可以加快此查询,在上表中添加一些索引,例如:
ALTER TABLE LnsPriceUpdates
ADD INDEX LnsPriceUpdates_IDX_1 (level1Net, partnumber) ;
ALTER TABLE LnsPriceUpdates
ADD INDEX LnsPriceUpdates_IDX_2 (partnumber) ;
ALTER TABLE Lnscatalog
ADD INDEX Lnscatalog_IDX_2 (dealerCost) ;
可以找到有关优化SQL查询的一些参考here,here和here
希望这个帮助