PHP循环导入Excel数据到数据库如何避免插入重复记录
问题根源
当前逻辑仅校验了企业唯一编号是否已存在于数据库,未校验当前Excel文件内是否有重复的同编号待插入行,因此同个未入库的编号在Excel中出现多少次,就会重复插入多少次。你之前用goto的逻辑存在错误,跳转回循环开头会反复处理同一行数据,才会出现单条记录插入几百次的问题。
解决方案
在循环外声明一个临时数组,记录本次导入已经处理过的企业唯一编号,双重校验避免重复插入:
// 循环外新增:存储本次导入已处理过的企业唯一编号,用键存编号isset判断效率远高于in_array $processedEik = []; for ($i = $data_start_row; $i < $sheetCount + 1; $i++) { $currentEik = $spreadSheetAry[$i][$client_eik]; // 先校验当前编号是不是在本次导入里已经处理过,是就直接跳过 if (isset($processedEik[$currentEik])) { continue; } $externalsales->eik = $currentEik; if ($externalsales->getSocieteByBulstat() > 0) { // 已存在数据库的编号也加入已处理数组,避免同个已存在的编号重复查库 $processedEik[$currentEik] = true; continue; } else { $importfromexcel->nom = $spreadSheetAry[$i][$client_name]; $importfromexcel->address = $spreadSheetAry[$i][$client_address]; $importfromexcel->town = $spreadSheetAry[$i][$client_city]; $importfromexcel->tva_intra = $currentEik; $importfromexcel->userId = $user->id; $importfromexcel->insertSocieteRecord(); // 新增完成后把编号加入已处理数组,后续同编号行直接跳过 $processedEik[$currentEik] = true; } }
如果导入数据量很大,也可以先一次性提取Excel中所有企业唯一编号去重后再逐个处理,能进一步减少不必要的循环和数据库查询。
内容的提问来源于stack exchange,提问作者milenmk
相关产品推荐
相关产品推荐

