PHP 不会从 for 循环在数据库中插入重复项

Posted

技术标签:

【中文标题】PHP 不会从 for 循环在数据库中插入重复项【英文标题】:PHP do no insert duplicates in database from for loop 【发布时间】:2021-11-10 16:48:47 【问题描述】:

我查看了一些类似的问题,但找不到解决方案。所以我从excel表中导入数据。数据包含公司名称、公司唯一编号、城市和地址。

我需要的是,检查数据库中是否存在唯一编号,如果是 - 跳过,如果不是 - 创建记录。下面是我的代码,循环遍历行:

for ($i = $data_start_row; $i < $sheetCount + 1; $i++) 
    $externalsales->eik = $spreadSheetAry[$i][$client_eik];
    if ($externalsales->getSocieteByBulstat() > 0) 
        continue;
     else 
        $importfromexcel->nom = $spreadSheetAry[$i][$client_name];
        $importfromexcel->address = $spreadSheetAry[$i][$client_address];
        $importfromexcel->town = $spreadSheetAry[$i][$client_city];
        $importfromexcel->tva_intra = $spreadSheetAry[$i][$client_eik];
        $importfromexcel->userId = $user->id;
        $importfromexcel->insertSocieteRecord();
    

问题是,有时文件中有不止一行,缺失记录的数据相同,因此在数据库中创建了重复项。我怎样才能避免这种情况?

尝试使用goto start;,其中start: 在for 循环之前,但这不起作用(插入的第一批丢失记录的一堆记录就像+500 个重复项一样)。

将其中一列设置为唯一是我的最后一个选择,但我更喜欢在脚本中进行。

【问题讨论】:

如果有重复键,请使用INSERT IGNORE 跳过插入。 您应该使键成为唯一索引,这样您就不会得到重复。 当然可以。它知道要忽略什么的唯一方法是是否存在唯一约束。 不管怎样,在调用insertSocieteRecord()之前检查一下你想要唯一的列是否已经在数据库中。 唯一索引是在关系数据库中实现的最终解决方案,以防止列或列组合中出现重复值。您可以开发执行重复值检查的代码,但是 1) 您必须对插入或更新该特定字段的数据的每个路由执行重复检查 2) 在并发插入的情况下,两个进程可能会尝试插入/ 同时更新相同的值,从而通过重复检查,但最终得到重复值。创建唯一索引要容易得多... 【参考方案1】:

所以,对于任何偶然发现这里的人,我的最终解决方案如下:

由于数据库的一些限制,我无法为目标表tva_intra中的归档societe设置唯一索引,所以我切换到两步处理

第一步:我创建了自定义表societe_temp,其字段与问题中描述的相同,并且对于该表,我能够为字段tva_intra设置唯一索引:

`ALTER TABLE societe_temp ADD UNIQUE idx_societe_temp_tva_intra (tva_intra);`

然后将excel文件中的记录插入此表中,从而避免任何重复记录。

第二步从临时表societe_temp中获取记录并插入到主表'societe'中

我知道这不是最佳解决方案,但它是一种解决方法,总有一天可以帮助某人。

【讨论】:

以上是关于PHP 不会从 for 循环在数据库中插入重复项的主要内容,如果未能解决你的问题,请参考以下文章

带有参数化游标的嵌套 for 循环正在插入重复记录

通过 for 循环和 php 数组进行多次插入(通过 jQuery AJAX 接收)

使用for循环将两个列表中的数据插入到dict [重复]

使用PHP从A-Z进行for循环[重复]

在PHP中循环插入查询[重复]

删除对象,使其不会在 for 循环中迭代 [重复]