【问题标题】:is there an alternate to using a for loop to insert multiple queries是否有使用 for 循环插入多个查询的替代方法
【发布时间】:2013-08-29 20:25:34
【问题描述】:

我想从数组中插入数据。下面是一个示例情况。

我在朋友列表 (fb) 中获取所有可用的朋友并将它们存储在一个数组中。

现在我想将他们的数据 (name, fbid, birthday) 插入到表中。

目前我正在使用 for 循环执行此操作,下面是示例代码。

<?php

  $friendsname = $_POST['name'];
  $friendsfbid = $_POST['fbid'];
  $friendsbday = $_POST['birthday'];

  for($i<0;count($friendsfbid);$i++){

     $sql_query  = "INSERT INTO table (fbid, name, birthday) VALUES ('$friendsfbid[$i]','$friendsname[$i]','$friendsbday[$i]') ON DUPLICATE KEY UPDATE fbid='$friendsfbid[$i]', name='$friendsname[$i]', birthday='$friendsbday[$i]'";    

  }

?>

现在,如果我有 300 个朋友,这将循环 300 次。

朋友的数量越多,处理数据所需的时间就越多。

有没有办法避免这种情况或提高代码的性能。 ?

在 mySQL 中使用 PHP

【问题讨论】:

标签: php mysql performance for-loop


【解决方案1】:

一次插入多行。见this example

INSERT INTO example
  (example_id, name, value, other_value)
VALUES
  (100, 'Name 1', 'Value 1', 'Other 1'),
  (101, 'Name 2', 'Value 2', 'Other 2'),
  (102, 'Name 3', 'Value 3', 'Other 3'),
  (103, 'Name 4', 'Value 4', 'Other 4');

通过php循环生成多行数据并在最后追加多行时发出单个插入

【讨论】:

    【解决方案2】:
    $sql = '';
    foreach($friendsfbid as $key => $value){
       $sql .= INSERT INTO table (fbid, name, birthday) VALUES ('$value[$key]','$friendsname[$key]','$friendsbday[$key]') ON DUPLICATE KEY UPDATE fbid='$value[$key]', name='$friendsname[$key]', birthday='$friendsbday[$key]'";
    }
    mysql_query($sql);
    

    您可以将您的 sql INSERT 堆叠成字符串,然后通过仅调用一次查询函数来运行它们。这应该会加快进程。

    【讨论】:

      【解决方案3】:

      请查看此查询,希望这将提高我们的代码和速度。

      避免在循环中执行 SQL 查询

      一个常见的错误是将 SQL 查询放在循环中。这会导致多次往返数据库,并显着降低脚本速度。在下面的示例中,您可以更改循环以构建单个 SQL 查询并一次插入所有用户。

      foreach ($userList as $user) {
      
        $query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
      
        mysql_query($query);
      
        }
      

      您可以将数据组合到单个数据库查询中,而不是使用循环。

      $userData = array();
      
      foreach ($userList as $user) {
      
          $userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
      
      }
      
      $query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
      
      mysql_query($query);
      

      【讨论】:

      • 您好,感谢您的回复。我想知道在这种情况下如何处理重复键?
      • 重复键是什么意思?
      • 如果数据已经存在怎么办?我希望它在这种情况下更新,所以内爆语句将如何工作。 (参考:插入用户(字段,字段3)值(val1,val2)ON DUPLICATE KEY UPDATE字段=val1);我正在考虑创建另一个数组来存储 ON DUPLICATE KEY UPDATE 子句并像您在当前答案中所做的那样将它们内爆
      • 是的,你是对的,你可以为重复键创建另一个数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多