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 '引數型別只能是一維陣列或字串!';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/265991.html
標籤:其他
上一篇:使用Spark加載資料到SQL Server列存盤表
下一篇:基于命令列mysql的基礎學習
