是否可以使用Zend_Db_Table更新多行?

时间:2011-02-18 07:50:47

标签: php mysql zend-framework

我有一个简单的数组。

$a = array(
   array('id' => 2, 'year' => 2010),
   array('id' => 3, 'year' => 2011)
);

我有一个带有id主键的MySQL表。现在我像这样更新我的表:

foreach ($a as $v) {
  $db->update($v, array('id = ?' => $v['id']));
}

我的$a包含3700行。我需要创建一个大查询而不是循环。怎么办?先感谢您。抱歉我的英文。

2 个答案:

答案 0 :(得分:7)

您的询问通常不会发生,因为您通常会使用update()将大量记录设置为具有相同的值,或将一条记录设置为具有许多不同的值。

解决这个问题的一种方法是汇总更新,因此使用您的数组获取2011年的所有ID,然后运行:

 $where = array();

 // This where should contain all the ids that need the year set to 2011
 // E.g.
 $where[] = array("id" => 3);

 $db->update("table_name", array("year" => 2011), $where);

这样做会减少查询次数,假设您有多年同一行。相关文档为here

或者您可以使用方法like this

OP响应后编辑

问题的本质意味着它无法有效解决。

您要求使用非常不同的数据集更新3,700行数据。如果数据集不同,那么就没有可以利用的模式来实现这种效果。查找模式,例如同年的行,并将它们用于您的优势将提高查询的速度,但需要以regilero所述的阵列混搭的形式进行大脑管理。

答案 1 :(得分:0)

这是关于how to update multiple rows quickly and easily的精彩文章。它通过聚合要在单独数组中设置的公共值,然后更新每个值来讨论崩溃多个更新语句到几个语句的方法:

$allIds = array();
foreach ($a as $item) {
    $allIds[$item['year']][] = $item['id'];
}
foreach ($allIds as $year => $ids) {
    $bind = array('year' => $year);
    $where = $db->quoteInto('id IN (?)', $ids);
    $db->update('table_name', $bind, $where);
}

如果没有或很少有常见值并且更新无法折叠到几个语句怎么办?在这种情况下,文章解释了以下方法:

  1. 创建一个临时表来保存更新
  2. 使用更新填充临时表
  3. 使用UPDATE ... FROM使用临时表中的更新来更新目标表
  4. 使用DROP TABLE删除临时表