【问题标题】:Basics rules on UPDATE statement for relational MySql table: for vs while关系MySql表的UPDATE语句的基本规则:for vs while
【发布时间】:2010-01-14 18:00:37
【问题描述】:

我正在使用 mysql 和 php 做我的第一步,所以我对正确的代码优化的基本规则有疑问。

我的UPDATE语句需要在一定数量的行上执行,因为它应该在关系表上执行,那么for cicle是否正确?

<?
// connection already created
$data[] = array ("id" => 54, "enabled" => 1);
$data[] = array ("id" => 33, "enabled" => 0);
$data[] = array ("id" => 12, "enabled" => 0);
$data[] = array ("id" => 58, "enabled" => 0);
$data[] = array ("id" => 21, "enabled" => 1);
$data[] = array ("id" => 10, "enabled" => 1);
$data[] = array ("id" => 18, "enabled" => 0);
$data[] = array ("id" => 32, "enabled" => 1);
$data[] = array ("id" => 84, "enabled" => 0);
$data[] = array ("id" => 80, "enabled" => 1);

for (var $i = 0; $i < count ($data); $i ++) {

    $id = $data[$i]["id"];
    $enabled = $data[$i]["enabled"];

    $sql = "UPDATE users SET user_enabled = '$enabled' WHERE user_id = '$id' LIMIT 1;";
    $res = mysql_query ($sql);
    $num = mysql_num_rows ($res);

}


?>

我应该使用while 还是for 循环? 此代码对多个 UPDATE 有效还是存在更好的内容,例如针对此类操作的特定查询?

【问题讨论】:

  • 如果您需要更新的记录数量足够大,有时最好对临时表执行一次批量 INSERT,然后通过与临时表的 JOIN 来更新目标表。

标签: php mysql


【解决方案1】:

对于有限长度的序列,您应该使用foreach 循环。

【讨论】:

    【解决方案2】:

    几个cmets:

    • 在循环的每次迭代中计算count($data) 是不必要的成本。从count($data) 开始循环并计数down,或者按照@Ignacio 的建议,使用foreach

    • 这是一个很好的例子,使用带参数的准备好的查询会很有好处。但是 PHP 的普通 mysql 扩展不支持此功能。您必须使用 mysqli 或最好使用 PDO

    • 您不必在 SQL 表达式中为整数值加上引号。

    • mysql_num_rows()UPDATE 查询毫无意义。您可能打算使用mysql_affected_rows()

    • 我不知道你为什么在这个查询中使用LIMIT,因为我猜user_idusers 表的主键,因此你永远不会更新超过一行无论如何。

    我会这样写代码:

    <?php
    // PDO connection already created
    $data[] = array ("id" => 54, "enabled" => 1);
    ...etc...
    
    $sql = "UPDATE users SET user_enabled = :enabled WHERE user_id = :id";
    $stmt = $pdo->prepare($sql);
    
    foreach ($data as $parameters) {
    
        $success = $stmt->execute($parameters);
        $num = $stmt->rowCount();
    
    }
    
    
    ?>
    

    【讨论】:

      【解决方案3】:

      你可以使用RecursiveArrayIterator

      <?
      // connection already created
      $data[] = array ("id" => 54, "enabled" => 1);
      $data[] = array ("id" => 33, "enabled" => 0);
      $data[] = array ("id" => 12, "enabled" => 0);
      $data[] = array ("id" => 58, "enabled" => 0);
      $data[] = array ("id" => 21, "enabled" => 1);
      $data[] = array ("id" => 10, "enabled" => 1);
      $data[] = array ("id" => 18, "enabled" => 0);
      $data[] = array ("id" => 32, "enabled" => 1);
      $data[] = array ("id" => 84, "enabled" => 0);
      $data[] = array ("id" => 80, "enabled" => 1);
      
      $data = new RecursiveArrayIterator($data);
      
      for (var $i = 0; $i < count ($data); $i ++) {
      
          $id = $data[$i]["id"];
          $enabled = $data[$i]["enabled"];
      
          $sql = "UPDATE users SET user_enabled = '$enabled' WHERE user_id = '$id' LIMIT 1;";
          $res = mysql_query ($sql);
          $num = mysql_num_rows ($res);
      
      }
      
      
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2016-02-24
        • 2019-08-22
        • 2014-09-30
        • 2021-03-18
        • 1970-01-01
        相关资源
        最近更新 更多