【发布时间】: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) 在并发插入的情况下,两个进程可能会尝试插入/ 同时更新相同的值,从而通过重复检查,但最终得到重复值。创建唯一索引要容易得多...
标签: php mysql for-loop import duplicates