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

php在mysql里批量插入数据(代码实例)

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-01 09:43:14 浏览: 评论:0 

假如说我有这样一个表,我想往这个表里面插入大量数据:

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

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

php在mysql里批量插入数据(代码实例)

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

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

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

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

php在mysql里批量插入数据(代码实例)

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

Tags: php批量插入数据

分享到: