如何用PHP foreach分批插入MySQL数据,突破单次20k限制
分批批量插入解决方案
你的问题核心是逐条插入效率低且超过服务器单次插入限制,改成按20k每批做批量插入即可解决问题,同时还能提升插入性能。以下是修改后的代码:
$url_setting = LIBRARY_PATH.'data/uploads/document/dataSettin.json'; $jsondata_setting = file_get_contents($url_setting); $data_setting = json_decode($jsondata_setting, true); // 定义每批插入的数量,匹配服务器限制的20k $batchSize = 20000; // 将原始数据拆分为若干批次 $batches = array_chunk($data_setting, $batchSize); foreach ($batches as $batch) { // 整理当前批次的插入数据格式 $insertData = []; foreach ($batch as $row) { $insertData[] = [ 'PROMO_CODE' => $row['PROMO_CODE'], 'PROMO_NAME' => $row['PROMO_NAME'], 'DISCOUNT_TYPE' => $row['DISCOUNT_TYPE'], 'PROMO_PRIORITY' => $row['PROMO_PRIORITY'], 'PROCESS_TYPE' => $row['PROCESS_TYPE'], 'PROMO_STATUS' => $row['PROMO_STATUS'], 'CREATED' => $row['CREATED'], 'CREATEDBY' => $row['CREATEDBY'], 'UPDATED' => $row['UPDATED'], 'UPDATEDBY' => $row['UPDATEDBY'], ]; } // 用框架的批量插入方法(适配多数PHP数据库框架,如CodeIgniter的insert_batch) $db->insert_batch('M_PROMO_SETTING', $insertData); // 如果你的数据库类不支持批量插入方法,可手动构建SQL(记得转义防注入): // $columns = implode(', ', array_keys($insertData[0])); // $values = []; // foreach ($insertData as $item) { // $escapedVals = array_map(fn($val) => $db->escape($val), $item); // $values[] = '('.implode(', ', $escapedVals).')'; // } // $sql = "INSERT INTO M_PROMO_SETTING ($columns) VALUES ".implode(', ', $values); // $db->query($sql); }
关键说明:
array_chunk分批次:把100k条数据按20k每批拆分,确保每批数据量不触发服务器限制。- 批量插入替代逐条插入:相比循环调用
insert,批量插入会生成单条包含多条数据的INSERT语句,既符合服务器限制,又能大幅提升插入效率。 - 兼容性处理:如果所用框架没有批量插入方法,可使用注释中的手动构建SQL方式,注意对数据做转义避免SQL注入风险。
内容的提问来源于stack exchange,提问作者hardyOfficial Official
相关产品推荐
相关产品推荐

