大文件内容写入数据库
问题和困难
1.文件太大,数据不能一次读取
2.数据存在冗余,所以不能单纯的插入操作
解决
1.按行读取文件,计数累加,超过10000万行进行写库操作
while ($str = fgetcsv($file)) { //每次读取CSV里面的一行内容 $str = explode(" ",$str[0]); $insert_data[] = array( 'phone' => $str[0], 'type' => $str[2], 'number' => $str[3], ); $time++; if ($time > 10000) { $value = ""; $time = 0; foreach ($insert_data as $key => $item) { $value .= "(" . join(",",$item) ."),"; } $value = trim($value,','); // var_dump($value);die; save($value,$mysqli); // die; }}
2.写数据库操作,自动根据数据库内容进行选择插入还是修改操作
INSERT INTO flag_17_09 (`phone`,`type`,`number`) VALUES $value ON DUPLICATE KEY UPDATE number=number+VALUES(number)
如果主键存在,则更新,如不存在则执行插入操作,更新时将本次数据与原有数据相加保存
其中,向MySQL写入大量数据时,可以考虑采用PDO模式
ini_set('max_execution_time','0');$pdo = new PDO("mysql:host=localhost;dbname=oradt_cloud1520","root","123456");$sql = "insert into scan_card_picture (uuid,account_id,handle_state,created_time,status,from_account,accuracy,ifupdate) values";for($i=0; $i<100000; $i++){ $str = strrand(32); $sql .="('".$str."','07:55:10','active','admin@qq.com','90',1),"; }$sql = substr($sql,0,strlen($sql)-1);var_dump($sql);if($pdo -> exec($sql)){ echo "插入成功!"; echo $pdo -> lastinsertid();}