我正在创建一个每天在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
当对上面的记录集使用一个简单的insert语句时,有16列和216.000记录需要大约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 =我目前拥有的值。
我的问题是我插入的记录基本没有什么独特之处。仅当与要导入的数据集进行比较时,唯一性才来自一组字段。如果我以某种方式管理以获得唯一性,我也将解决我的其他问题,即在ItemQty更改时删除行或更新行。
答案 0 :(得分:1)
您正在寻找的是unique constraint。使用唯一约束,您可以将所有列添加到约束中,如果所有列都满足插入数据,则不会继续插入
答案 1 :(得分:1)
几个选项:
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)按日期按升序对数据进行排序(在插入数据库之前)。然后,在您的子句中,使用ON DUPLICATE KEY UPDATE
。这将导致mysql使用重复键更新记录。在这种情况下,将首先插入旧记录,因此将最后插入最新记录,覆盖旧记录数据。