一次性批量插入太好用了

根据某个条件,插入一条数据;

满足这个条件的数据共有5684条,所以新增加的数据也有5684条,按之前的写法,一条条插入,得有个5684条sql insert info 语句,循环执行这个脚本下来,可能还需要用到队列或者放在linux环境才能顺利执行,毕竟一般web端执行apache会有一个超时的时间限制,即便去掉了这个超时限制,这个脚本执行起来同样慢的不可描述!

 

不管如何,还是记录一下曾经用过的一条条执行的老办法吧:

<?php
$servername = "127.0.0.1";
$username = "root";
$password = "d**********";
$dbname = "c************";

// 创建数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);

mysqli_set_charset($conn,"utf8");

$check_big_id = "select id from table_name  order by id desc limit 1"; //查出最大的记录id
$big_id_result = $conn->query($check_big_id);
while($rows  = $big_id_result ->fetch_assoc()) {
    $big_id =  $rows['id'];
}


$check_list_id = "select* from table_name where pid=4 "; //limit 1000 单条时候需要limit ,批量插入几千条内亲测不需要limit了。
$result = $conn->query($check_list_id);

$list_id_str = '';
$list_id_arr = array();
while($row  = $result->fetch_assoc()) {
    $big_id++;

    //单条插入时:
    $list_id = $row['list_id'];

    //批量插入时,把list_id组成数组
    $list_id_arr[] = array(
        "id"=>$big_id,
        "list_id"=>$row['list_id'],
        "pid"=>8
    );

    // *********************以下是单条插入***************************//
    
    //排除已录入的记录
    $check_list_id_now = "select* from table_name where list_id='{$list_id}' and pid=8 limit 1";

    $result_now = $conn->query($check_list_id_now);

    if($result_now->num_rows<1){
        $insert_sql = " insert into table_name(id,list_id,pid) values('{$big_id}','{$list_id}',8)";

         echo "\n";
         echo "----*---";
         echo $insert_sql;
         echo "----*---";
         echo "\n";

         $conn->query($insert_sql);

         //sleep(1);

       //这种单条sql插入数据的办法,就会产生几千条insert into 的sql  
    }

}

?>

批量插入,等于把sql语句组合成:insert into table_name(field1,field2,field3) values("a1","b1","c1"), ("a2","b2","c2"),("a3","b3","c3")······  //注意sql的长度,某些数据库会有限制;

 

// *********************以下是批量插入***************************//


$sql = "INSERT INTO %s( %s ) values %s ";

$arrValues = array();
foreach ($list_id_arr as $k => $v) { //list_id_arr 就是要插入的数据
    $arrValues[$k] = "'".implode("','",array_values($v))."'";
}

$arr_key = array('id','list_id','pid‘);

$sql = @sprintf($sql, 'table_name', "{$split}" . implode("{$split} ,{$split}", $arr_key) . "{$split}", "(" . implode(") , (", array_values($arrValues)) . ")");

//echo $sql;
echo  date("Y-m-d H:i:s",time());
echo '---*---';

$results = $conn->query($sql);

var_dump($results);

echo '---**---';

echo  date("Y-m-d H:i:s",time());

echo '---*插入数据结束*--’;
exit();

打开执行脚本的页面,

然后···

还没反应过来就执行完了····

太棒了!!!

 

下面是某大神做的一个时间方面的统计,可以做个参考

2015411105457735.jpg (362Ã152)

2015411105524293.jpg (529Ã196)

 

以上就是我本次的分享,如果有不到位的地方,敬请谅解和指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值