暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

php实现向mysql批量插入数据

php中文网最新课程 2020-02-14
255

php中文网最新课程

每日17点准时技术干货分享

现在有这样一个表,我们想往这个表里面插入大量数据该如何实现呢?

    CREATE TABLE IF NOT EXISTS `user_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `name` varchar(255) NOT NULL default '' COMMENT '姓名',
    `age` int(11) NOT NULL default '0' COMMENT '年龄',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';

    批量插入

    方法一、使用for循环插入

    在往mysql插入少量数据的时候,我们一般用for循环

      $arr = [ 
      [
      'name' => 'testname1',
      'age' => 18,
      ],
      [
      'name' => 'testname2',
      'age' => 19,
      ],
      [
      'name' => 'testname3',
      'age' => 18,
      ],
      ];


      $servername = "localhost";
      $port = 3306;
      $username = "username";
      $password = "password";
      $dbname = "mytestdb";


      // 创建连接
      $conn = new mysqli($servername, $username, $password, $dbname, $port);


      // 检测连接
      if ($conn->connect_error) {
      die("connect failed: " . $conn->connect_error);
      }


      $costBegin = microtime(true);


      foreach($arr as $item) {
      $sql = sprintf("INSERT INTO user_info (name, age) VALUES ( '%s', %d);", $item['name'], (int)$item['age']);
      if ($conn->query($sql) === TRUE) {
      echo "insert success";
      } else {
      echo "Error: " . $sql . "<br>" . $conn->error;
      }
      }


      $costEnd = microtime(true);
      $cost = round($costEnd - $costBegin, 3);
      var_dump($cost);


      $conn->close();

      假如说要批量插入大量数据,如果还用for循环的办法插入是没有问题的,只是时间会比较长。

      对比一下插入少量数据与插入大量数据,使用上面的for循环插入耗费的时间:条数时间(单位:秒)

      方法二、使用insert语句合并插入

      mysql里面是可以使用insert语句进行合并插入的,比如

        INSERT INTO user_info (name, age) VALUES ('name1', 18), ('name2', 19);表示一次插入两条数据


        $arr = [
        [
        'name' => 'testname1',
        'age' => 18,
        ],
        [
        'name' => 'testname2',
        'age' => 19,
        ],
        [
        'name' => 'testname3',
        'age' => 18,
        ],
        // 此处省略
        ……
        ……
        ];


        $servername = "localhost";
        $port = 3306;
        $username = "username";
        $password = "password";
        $dbname = "mytestdb";


        // 创建连接
        $conn = new mysqli($servername, $username, $password, $dbname, $port);


        // 检测连接
        if ($conn->connect_error) {
        die("connect failed: " . $conn->connect_error);
        }


        $costBegin = microtime(true);


        if (!empty($arr)) {
        $sql = sprintf("INSERT INTO user_info (name, age) VALUES ");


        foreach($arr as $item) {
        $itemStr = '( ';
        $itemStr .= sprintf("'%s', %d", $item['name'], (int)$item['age']);
        $itemStr .= '),';
        $sql .= $itemStr;
        }


        // 去除最后一个逗号,并且加上结束分号
        $sql = rtrim($sql, ',');
        $sql .= ';';


        if ($conn->query($sql) === TRUE) {
        } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
        }
        }


        $costEnd = microtime(true);
        $cost = round($costEnd - $costBegin, 3);
        var_dump($cost);


        $conn->close();

        下面看一下少量数据与大量数据的时间对比。从总体时间上,可以看出insert合并插入比刚才for循环插入节约了很多时间,效果很明显条数时间(单位:秒)

        如果你觉得数组太大,想要减少sql错误的风险,也可以使用array_chunk将数组切成指定大小的块,然后对每个块进行insert合并插入。

        请点击下方:“阅读原文”,在线查看全部文章内容!

        文章转载自php中文网最新课程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论