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 '参数类型只能是一维数组或字符串!';
}