You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:18:03