免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13321 | 回复: 12
打印 上一主题 下一主题

请教批量插入MYSQL数据的PHP语句写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-23 22:56 |只看该作者 |倒序浏览
现在有个对一个Mysql库操作导出sql文件的php语句是这样写的
    $sql = "insert INTO `" . $database . "`.`" . $table . "` (" . implode( ',',$fields ) . ") VALUES (" . implode( ',',$values ) . ");\n";
但是这样输出出来的sql语句臃肿庞大冗余。全是
replace INTO `test`.`character_inventory` (`guid`,`bag`,`slot`,`item`,`item_template`) VALUES ('1448','0','24','127273','8766');
replace INTO `test`.`character_inventory` (`guid`,`bag`,`slot`,`item`,`item_template`) VALUES ('1448','0','25','105269','6948');
replace INTO `test`.`character_inventory` (`guid`,`bag`,`slot`,`item`,`item_template`) VALUES ('1448','0','26','1165834','99999');
replace INTO `test`.`character_inventory` (`guid`,`bag`,`slot`,`item`,`item_template`) VALUES ('1448','0','28','3791188','32838');
这样的一条条的语句输出,要是直接在mysql下用source导入,几百万条数据导入的简直慢的出奇,
现在请教各位看这个语句改怎么写才有效输出出来效率高的sql语句啊!
就跟phpmyadmin那样用扩展插入输出出来的sql语句简洁高效啊,希望有人能帮我!谢谢了!

[ 本帖最后由 ninglon 于 2009-9-23 23:50 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-09-24 09:02 |只看该作者
insert INTO `test`.`character_inventory`
(`guid`,`bag`,`slot`,`item`,`item_template`) VALUES
('1448','0','24','127273','8766'),
('1448','0','25','105269','6948'),
....

论坛徽章:
0
3 [报告]
发表于 2009-09-24 10:00 |只看该作者
原帖由 bs 于 2009-9-24 09:02 发表
insert INTO `test`.`character_inventory`
(`guid`,`bag`,`slot`,`item`,`item_template`) VALUES
('1448','0','24','127273','8766'),
('1448','0','25','105269','6948'),
....



首先谢谢回复,但是您回复的是mysql的写法,我需要的是针对php语句的写法,都是变量的,请问怎么写呢?

论坛徽章:
0
4 [报告]
发表于 2009-09-24 10:44 |只看该作者
写个循环,楼主再多看看语法

论坛徽章:
0
5 [报告]
发表于 2009-09-24 16:21 |只看该作者
原帖由 ninglon 于 2009-9-23 22:56 发表
现在有个对一个Mysql库操作导出sql文件的php语句是这样写的
    $sql = "insert INTO `" . $database . "`.`" . $table . "` (" . implode( ',',$fields ) . ") VALUES (" . implode( ',',$values ) . ");\n"; ...

程序设计的有问题,麻烦
我就想出来着一个方法,看看吧

  1. <?php
  2.         $database = 'test';
  3.         $table = 'users';
  4.         $fields = array('username','password','age','sex');
  5.         $values = array(array('u1','p1',20,1),array('u2','p2',21),array('u3','p3',22,1));
  6.         $sql = sprintf( "INSERT INTO `%s`.`%s`(%s) VALUE ", $database, $table, implode( ',',$fields ) );
  7.         $nv= count($values);
  8.         $nf = count($fields);
  9.         for ( $i = 0; $i < $nv; $i++ )
  10.         {
  11.                 $val = '';
  12.                 for( $j = 0; $j < $nf; $j++ )
  13.                 {
  14.                         $val .= sprintf( "'%s',", $values[$i][$j] );
  15.                 }
  16.                 $sql .= sprintf( "(%s),", substr( $val, 0, -1 ) );
  17.         }
  18.         echo substr( $sql, 0, -1);
  19. ?>
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-09-24 21:16 |只看该作者
执行之前把索引停掉,完成后再启用会加快插入速度。
alter table tbl disable keys;
alter table tbl enable keys;

$sql = "INSERT INTO test (" . implode( ',',$fields ) . ") VALUES ";

$tmp = array();
foreach (.....) {

         $tmp[] = "(".implode(',', $values).")";

}

$sql .= implode(','  $tmp);

论坛徽章:
0
7 [报告]
发表于 2009-09-25 13:02 |只看该作者
原帖由 panzt 于 2009-9-24 10:44 发表
写个循环,楼主再多看看语法

论坛徽章:
0
8 [报告]
发表于 2009-09-25 19:49 |只看该作者
学习了

论坛徽章:
0
9 [报告]
发表于 2009-09-29 01:56 |只看该作者
学习了:wink:

论坛徽章:
0
10 [报告]
发表于 2009-10-09 01:10 |只看该作者
数据量庞大的话考虑使用重定向!不然自己想结果 - -
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP