簡體   English   中英

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

[英]Is it possible to update multiple rows at the time using Zend_Db_Table?

我有一個簡單的數組。

$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行。 我需要創建一個大查詢而不是循環。 怎么辦 先感謝您。 對不起我的英語不好。

您的詢問通常不會完成,因為您通常會使用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);

假設您在同一年中有很多行,這樣做會減少查詢的數量。 有關此文檔,請參見此處

或者你可以使用的方法是這樣

OP響應后編輯

問題的本質意味着無法有效解決。

您要求一種使用非常不同的數據集更新3700行數據的方法。 如果數據集不同,那么您就無法利用任何模式來提高效率。 查找模式(如同一年的行)並將其用於您的優勢將提高查詢速度,但將需要一些人的大腦迷惑,如regilero指出的那樣,采用陣列混搭的形式。

這是一篇有關如何快速輕松地更新多行的出色文章。 它討論了通過匯總要在單獨數組中設置的公共值,然后更新每個值來將多個update語句折疊為幾個語句的方法:

$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刪除臨時表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM