当前位置:首页 > PHP教程 > php应用 > 列表

php实现向mysql批量插入数据

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-02 08:58:03 浏览: 评论:0 

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

  1. CREATE TABLE IF NOT EXISTS `user_info` ( 
  2.  
  3. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键'
  4.  
  5. `namevarchar(255) NOT NULL default '' COMMENT '姓名'
  6.  
  7. `age` int(11) NOT NULL default '0' COMMENT '年龄'
  8.  
  9. PRIMARY KEY (`id`) 
  10.  
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表'

批量插入

方法一、使用for循环插入

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

  1. $arr = [  
  2.  
  3.  
  4. 'name' => 'testname1'
  5.  
  6. 'age' => 18, 
  7.  
  8. ], 
  9.  
  10.  
  11. 'name' => 'testname2'
  12.  
  13. 'age' => 19, 
  14.  
  15. ], 
  16.  
  17.  
  18. 'name' => 'testname3'
  19.  
  20. 'age' => 18, 
  21.  
  22. ], 
  23.  
  24. ];  
  25.  
  26. $servername = "localhost"
  27.  
  28. $port = 3306; 
  29.  
  30. $username = "username"
  31.  
  32. $password = "password"
  33.  
  34. $dbname = "mytestdb"
  35.   
  36. // 创建连接 
  37.  
  38. $conn = new mysqli($servername$username$password$dbname$port); 
  39.   
  40. // 检测连接 
  41.  
  42. if ($conn->connect_error) { 
  43.  
  44. die("connect failed: " . $conn->connect_error); 
  45.  
  46. }  
  47.   
  48. $costBegin = microtime(true); 
  49.   
  50. foreach($arr as $item) { 
  51.  
  52. $sql = sprintf("INSERT INTO user_info (name, age) VALUES ( '%s', %d);"$item['name'], (int)$item['age']);  
  53.  
  54. if ($conn->query($sql) === TRUE) { 
  55.  
  56. echo "insert success"
  57.  
  58. else { 
  59.  
  60. echo "Error: " . $sql . "<br>" . $conn->error; 
  61.  
  62.  
  63.   
  64. $costEnd = microtime(true); 
  65.  
  66. $cost = round($costEnd - $costBegin, 3); 
  67.  
  68. var_dump($cost); 
  69.  
  70.  
  71.  
  72. $conn->close(); 

假如说要批量插入大量数据,如果还用for循环的办法插入是没有问题的,只是时间会比较长。对比一下插入少量数据与插入大量数据,使用上面的for循环插入耗费的时间:条数时间(单位:秒)

php实现向mysql批量插入数据

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

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

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

  1. $arr = [  
  2.  
  3.  
  4. 'name' => 'testname1'
  5.  
  6. 'age' => 18, 
  7.  
  8. ], 
  9.  
  10.  
  11. 'name' => 'testname2'
  12.  
  13. 'age' => 19, 
  14.  
  15. ], 
  16.  
  17.  
  18. 'name' => 'testname3'
  19.  
  20. 'age' => 18, 
  21.  
  22. ], 
  23.  
  24. // 此处省略 
  25.  
  26. …… 
  27.  
  28. …… 
  29.  
  30. ]; 
  31.  
  32.  
  33.  
  34. $servername = "localhost"
  35.  
  36. $port = 3306; 
  37.  
  38. $username = "username"
  39.  
  40. $password = "password"
  41.  
  42. $dbname = "mytestdb"
  43.  
  44.  
  45.  
  46. // 创建连接 
  47.  
  48. $conn = new mysqli($servername$username$password$dbname$port); 
  49.  
  50.  
  51.  
  52. // 检测连接 
  53.  
  54. if ($conn->connect_error) { 
  55.  
  56. die("connect failed: " . $conn->connect_error); 
  57.  
  58. }  
  59.  
  60.  
  61.  
  62. $costBegin = microtime(true); 
  63.  
  64.  
  65.  
  66. if (!emptyempty($arr)) { 
  67.  
  68. $sql = sprintf("INSERT INTO user_info (name, age) VALUES "); 
  69.  
  70.  
  71.  
  72. foreach($arr as $item) { 
  73.  
  74. $itemStr = '( '
  75.  
  76. $itemStr .= sprintf("'%s', %d"$item['name'], (int)$item['age']); 
  77.  
  78. $itemStr .= '),'
  79.  
  80. $sql .= $itemStr
  81.  
  82.  
  83.  
  84.  
  85. // 去除最后一个逗号,并且加上结束分号 
  86.  
  87. $sql = rtrim($sql','); 
  88.  
  89. $sql .= ';'
  90.  
  91.  
  92.  
  93. if ($conn->query($sql) === TRUE) { 
  94.  
  95. else { 
  96.  
  97. echo "Error: " . $sql . "<br>" . $conn->error; 
  98.  
  99.  
  100.  
  101.  
  102.  
  103. $costEnd = microtime(true); 
  104.  
  105. $cost = round($costEnd - $costBegin, 3); 
  106.  
  107. var_dump($cost); 
  108.  
  109.  
  110.  
  111. $conn->close(); 

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

php实现向mysql批量插入数据

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

Tags: mysql批量插入数据

分享到: