【问题标题】:Update multiple rows for 1000 records in one go一次更新 1000 条记录的多行
【发布时间】:2020-12-11 23:33:33
【问题描述】:

我有一张表,我必须根据这张表更新另一张表中的 6 行以匹配 id。它总共有超过 1000 条记录,所以大多数时候我都会遇到当前脚本超时错误。

我现在的做法是,我从第一个表中选择两个日期之间的 id 范围,将其存储到一个数组中,然后运行 ​​foreach 循环在第二个表中进行更新,其中 id 相同,所以基本上我对每个 id 运行一个查询。

有什么办法可以加快这个过程吗?

我发现只有一种在 foreach 循环中生成 each 的方法

UPDATE product SET price = CASE
WHEN ID = $ID1 THEN $price1
WHEN ID = $ID1 THEN $price2
END

但我不知道如何修改它以同时更新多行而不仅仅是一个。

我的脚本代码是这样的

  $sql = "SELECT * FROM `games` where  (ev_tstamp >= '".$timestamp1."' and ev_tstamp <= '".$timestamp2."')";

  while($row = mysqli_fetch_array($sql1)){ 
  $one_of =[
  "fix_id" =>$row['fix_id'],   
  "t1_res" =>$row['t1_res'],
  "t2_res" =>$row['t2_res'],
  "ht_res_t1" =>$row['ht_res_t1'],
  "ht_res_t2" =>$row['ht_res_t2'],
  "y_card_t1" =>$row['y_card_t1'],
  "y_card_t2" =>$row['y_card_t2'],
  "t1_corners" =>$row['t1_corners'],
  "t2_corners" =>$row['t2_corners'],
  "red_card_t1" =>$row['red_card_t1'],
  "red_card_t2" =>$row['red_card_t2']
   ];
   array_push($today_games,$one_of); 
    }

   foreach($today_games as $key=>$val){
        $cards_t1=$val['red_card_t1']+$val['y_card_t1'];
        $cards_t2=$val['red_card_t2']+$val['y_card_t2'];
   $sql = "Update sights SET t1_res='".$val['t1_res']."', 
     t2_res='".$val['t2_res']."', ev_tstamp='".$val['ev_tstamp']."',
     ht_res_t1='".$val['ht_res_t1']."', ht_res_t2='".$val['ht_res_t2']."', 
     t1_corners='".$val['t1_corners']."',t2_corners='".$val['t2_corners']."',
     t1_cards='".$cards_t1."',t2_cards='".$cards_t2."'
     where fix_id='".$val['fix_id']."' "
    }

【问题讨论】:

  • 当前脚本出现超时错误。你当前的脚本是什么?
  • 请出示您的桌子好吗?基于上述,您应该能够使用join 进行更新,这将极大地简化您的查询。实际上,如果我正确理解了这个问题,您的 case when... 声明似乎正在做一种粗略的加入。
  • 以前都问过。您可以使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语法,如stackoverflow.com/questions/3432/multiple-updates-in-mysql 所述
  • 第一个SQL更新查询与PHP中的更新有关?此外,由于没有使用 WHERE 条件,PHP 会更新 所有sights。最后,看看SQL parameterization而不是乱七八糟的字符串插值,
  • 第一个 sql 只是选择数据,然后更新与 fix_id 匹配的另一个表,抱歉缺少那部分

标签: php sql loops foreach


【解决方案1】:

考虑使用fix_id 作为连接列的UPDATE...JOIN 查询。下面使用时间戳运行mysqli 参数化查询。不需要循环。

$sql = "UPDATE sights s
        INNER JOIN `games` g 
             ON s.fix_id = g.fix_id
             AND g.ev_tstamp >= ? and g.ev_tstamp <= ? 
        SET s.t1_res.    = g.t1_res, 
            s.t2_res.    = g.t2_res, 
            s.ev_tstamp  = g.ev_tstamp, 
            s.ht_res_t1  = g.ht_res_t1, 
            s.ht_res_t2  = g.ht_res_t2, 
            s.t1_corners = g.t1_corners,
            s.t2_corners = g.t2_corners,
            s.t1_cards   = (g.red_card_t1 + g.y_card_t1),
            s.t2_cards   = (g.red_card_t2 + g.y_card_t2)";

$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 'ss', $timestamp1, $timestamp2);

mysqli_stmt_execute($stmt);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2011-02-14
    相关资源
    最近更新 更多