mysql列集合中的唯一索引


mysql unique index from set of columns

我正在创建一个每天在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使用重复的密钥更新记录。在这种情况下,将首先插入较旧的记录,因此最后插入的记录将覆盖旧记录数据。