使用MySQL LOAD DATA LOCAL INFILE导入数据时如何每行插入动态数组值?
结论
你提出的需求无法直接通过原生LOAD DATA LOCAL INFILE语句实现。
因为LOAD DATA是MySQL层面的批量导入指令,运行在MySQL进程内,无法直接读取PHP运行时的数组变量,也不支持直接绑定外部数组做逐行取值匹配。你现有代码中直接把$count数组拼入SQL语句的写法也存在语法错误,数组直接转字符串会触发PHP报错,就算调整为固定值也无法实现逐行迭代插入不同值的需求。
可行实现方案
方案1:预处理CSV文件后导入(推荐,适合大数据量)
先通过PHP把$count数组的值追加到CSV对应行的末尾,生成处理后的新CSV文件,再用LOAD DATA导入,性能损耗极低:
$count = array(1,2,3); // 读取原始CSV $source_fp = fopen('data.csv', 'r'); // 生成处理后的临时CSV $target_fp = fopen('processed_data.csv', 'w'); // 跳过原始表头,写入新表头(新增count列) fgetcsv($source_fp); fputcsv($target_fp, ['column1', 'column2', 'column3', 'column4', 'count']); $row_index = 0; while (($row = fgetcsv($source_fp)) !== false) { // 仅处理有对应count值的行 if (isset($count[$row_index])) { $row[] = $count[$row_index]; fputcsv($target_fp, $row); } $row_index++; } fclose($source_fp); fclose($target_fp); // 导入处理后的CSV $query = 'LOAD DATA LOCAL INFILE "processed_data.csv" IGNORE INTO TABLE data_table FIELDS TERMINATED BY "," LINES TERMINATED BY "\r\n" IGNORE 1 LINES (name1, name2, addr1, addr2, count)'; $statement = $pdo->prepare($query); $statement->execute();
方案2:逐行读取CSV插入(适合小数据量)
如果数据量不大,可以放弃LOAD DATA,直接逐行读取CSV内容,绑定$count数组的值插入,逻辑更灵活:
$count = array(1,2,3); $fp = fopen('data.csv', 'r'); // 跳过表头 fgetcsv($fp); $insert_stmt = $pdo->prepare("INSERT INTO data_table (name1, name2, addr1, addr2, count) VALUES (?, ?, ?, ?, ?)"); $row_index = 0; while (($row = fgetcsv($fp)) !== false) { if (isset($count[$row_index])) { $insert_stmt->execute([ $row[0], $row[1], $row[2], $row[3], $count[$row_index] ]); } $row_index++; } fclose($fp);
内容的提问来源于stack exchange,提问作者Surya Singh
相关产品推荐
相关产品推荐

