列集中的mysql唯一索引

时间:2016-04-07 08:43:16

标签: php mysql database

我正在创建一个每天在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更改时删除行或更新行。

2 个答案:

答案 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使用重复键更新记录。在这种情况下,将首先插入旧记录,因此将最后插入最新记录,覆盖旧记录数据。