我正在创建一个每天在mysql中插入(或更新)值的应用程序。具有标题的简化记录集是:
ItemName,ItemNumber,ItemQty,Date
test1,1,5,2016/01/01
test1,1,3,2016/01/02
test2,2,7,2016/01/01
test2,2,5,2016/01/02
当为上面有16列和216.000条记录的记录集使用一个简单的insert语句时,大约需要4分钟(php/mysql)-这包括一周的值。当然,如果我导入相同的记录集,我会得到重复的记录集。我正试图找到一种有效地禁止重复条目的方法。目的是:在我每天导入一个具有当前周日期的记录集的情况下,我最终只添加了新的日期。
在连续导入中唯一可能发生变化的是ItemQty。在php中,我创建了一个逻辑,在这里我用要插入的值查询数据库中的ItemName、ItemNumber和Date。如果SELECT语句中有结果,则中断。如果没有,我继续插入新行。问题是,现在添加了这个逻辑,它不需要4分钟,而是几个小时。(尽管有效)
有什么想法吗?
当我插入时,我想插入一些类似校验和列的东西,例如md5(ItemName,ItemNumber,ItemQty,Date),然后检查这个校验和,而不是SELECT*FROM$table WHERE ItemName=value,ItemNumber=value,ItemQty=value,Date=value。
我的问题是,我插入的记录基本上没有什么独特之处。只有当与要导入的数据集进行比较时,唯一性才来自一组字段。如果我设法获得唯一性,我也会解决我的另一个问题,即当ItemQty更改时删除一行或更新一行。
您要查找的是唯一约束。使用唯一约束,您可以将所有列添加到约束中,如果所有列都满足插入数据,则不会继续插入
少数选项:
1) 在PHP上,对记录进行迭代,映射重复的记录并保持newests
$itemsArray = []; // The array where you have stored your data
$uniqueItems = [];
foreach($itemsArray as $item)
{
if(isset($uniqueItems[$item['ItemName']]))
{
$oldRecord = $uniqueItems[$item['ItemName']];
$newTimeStamp = strtotime($item['Date']); // Might not work with your format date
$currentTimeStamp = strtotiem($oldRecord['Date']);
if($newTimeStamp > $currentTimeStamp)
{
$uniqueItems[$item['ItemName']] = $item;
}
}
else
{
$uniqueItems[$item['ItemName']] = $item;
}
}
// uniqueItems now hold only 1 record per ItemName (the newest one)
2) 按日期升序对php中的数据进行排序(在插入数据库之前)。然后,在您的子句中,使用ON DUPLICATE KEY UPDATE
。这将导致mysql使用重复的密钥更新记录。在这种情况下,将首先插入较旧的记录,因此最后插入的记录将覆盖旧记录数据。