PHP 编写 MYSQL 新增并且更新的批量入库方法

PHP编写 MYSQl INSERT批量入库(新增和更新)

php 编写批量insert批量入库的方法,新增的同时对已经存在的数据进行更新

注:

  • 生成的SQL语句中使用了MYSQL中的ON DUPLICATE KEY UPDATE
  • 使用该方法请到数据表中,设置唯一的字段

1. 使用方法

#入库数据必须保持一致,没有的填入空
$data =[
['name'=>'小明','age'=>12,'img'=>'12.png'],
['name'=>'小红','age'=>13,'img'=>'13.png'],
['name'=>'小刚','age'=>11,'img'=>'11.png'],
['name'=>'小黄','age'=>'','img'=>'14.png'],
['name'=>'小黄','age'=>10,'img'=>'10.png'],
['name'=>'小绿','age'=>9,'img'=>''],
]; 
#把多条数据入库studnet表(studnet表中作者设置了name字段唯一)
mostInsert('studnet',$data,'',true);

2. mostInsert()详细代码

/**
* 批量数据入库
* @param $data_arr array [必须] 需要入库的数据
* @param $table   [必须]  表名
* @param $fields  string [非必须] 需要入库的字段 不填默认是$data_arr中的k值
* @param $update  bool|string [非必须] 入库时出现重复需要更新的字段 true:使用$fields的字符串
*/
function mostInsert($table,$data_arr,$fields='',$update=false)
{
    
    
    $i    = 0;
    $left ='(';
    $right='),';
    // 批量入库时更新的内容
    $update_sql = '';
    if(count($data_arr)>50000) return '入库数据超过5w条使用其他方法吧';
    if(empty($fields)) {
    
    
        foreach ($data_arr[0] as $key=>$value){
    
    
            $fields .= "$key,";
        }
        $fields = rtrim($fields,',');
    }
    $fields_arr = explode(',',$fields);
    
    if($update===true) $update_sql    = $this->insertAndUpdateSql($fields);
    if(is_string($update)) $update_sql= $this->insertAndUpdateSql($update);
    
    $sql        = "INSERT INTO $table ($fields) VALUES ";
    foreach ($data_arr as $key => $data)
    {
    
    
        $now_sql = '';
        foreach ($fields_arr as $field){
    
    
            $now_field = trim($field,'`');
            if(!isset($data["$now_field"])&&$data["$now_field"]!=null) return "mostInsert方法使用错误|入库的数据中找不到{
      
      $data[$now_field]}字段";
            $now_sql.="'{
      
      $data[trim($field,'`')]}',";
        }
        $sql .= $left.rtrim($now_sql,',').$right;
        if($i>=5000){
    
    
            #TODO: $this->db->query() 作者项目中执行原生sql的方法,请更换此处
            $this->db->query(rtrim($sql,',').$update_sql);
            $i=0;
        }
        $i++;
    }
    #TODO: $this->db->query() 作者项目中执行原生sql的方法,请更换此处
    $this->db->query(rtrim($sql,',').$update_sql);
}

/**
 * 生成 入库时同时判断更新的mysql代码
 * @param $fields_arr_str string/array ='name,sex';
 * @return string sql
 */
function insertAndUpdateSql($fields_arr_str)
{
    
    
    if(is_array($fields_arr_str)||is_string($fields_arr_str)){
    
    
        $sql = " ON DUPLICATE KEY UPDATE ";
        $fields = $fields_arr_str;
        is_string($fields_arr_str) && $fields=explode(',',$fields_arr_str);
        foreach ($fields as $fd){
    
    
            $sql .= " $fd = VALUES($fd),";
        }
        return trim($sql,',');
    }
    return '参数类型只能是一维数组或字符串!';
}

猜你喜欢

转载自blog.csdn.net/weixin_47002974/article/details/114298701
今日推荐