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 循环在数据库中插入重复项的主要内容,如果未能解决你的问题,请参考以下文章