如何在单个列数据库中处理重复条目?

时间:2010-01-12 18:54:10

标签: sql mysql

用户可以在文本字段中输入关键字,并使用逗号分隔键 所以输入可能是bananas, apple, orange, pineapple

在我的数据库中,我有一个名为keyword的表,它只有一列keyword也是主键。

我通过$myArray = expload(',', $keywords)将关键字添加到数据库中 然后我遍历数组并执行`INSERT INTO myTable'。

现在,如果关键字已经存在,我将收到一条错误消息。

我可以使用INSERT IGNORE INTO语句来克服错误消息。如果记录是重复的,则IGNORE关键字告诉MySQL以静默方式丢弃它而不会产生错误。

我的问题是:这是一个很好的方法吗?或者我应该首先检查关键字是否存在? 我有点想两个问题而不是一个。这会影响服务器负载吗?

4 个答案:

答案 0 :(得分:4)

插入忽略是伟大的,它一石二鸟。

插入ignore理论上是非标准的sql,但它仍然非常有用。如果你需要使用其他存储引擎,你可以改善这些小事情,如果这样的事件发生了......在这种情况下不需要通过箍来预先移植你的代码。

答案 1 :(得分:1)

虽然在这种情况下我不会因为主要原因而不鼓励使用INSERT IGNORE,但我认为这里有一些实际的考虑因素。

我认为如果你在发送之前对数组进行重复数据删除会更快。我看起来你正在使用PHP - 你可以使用array_unique()进行重复数据删除。 (见http://nl2.php.net/manual/en/function.array-unique.php

这样做的好处是:

  1. 不需要INSERT IGNORE - 您的解决方案也适用于其他数据库
  2. 生成较少的语句,发送的语句较少,MySQL解析的语句较少 - 更快。
  3. 对于典型的Web应用程序,数据库操作比PHP处理慢,因此它也不会受到影响。
  4. 我建议的另一件事是生成一个大的INSERT语句,如下所示:

    $sql = INSERT INTO tab (keyword) VALUES ('word1'), ('word2'), ...
    

    与许多人认为这是标准SQL的情况相反。这样做的好处是你可以进行一次往返, - 减少开销

答案 2 :(得分:0)

INSERT IGNORE完全没问题。我知道的唯一其他语法是REPLACE INTO,但它适用于另一个用例(如果已经存在,则删除并插入该行,这可能更慢)。

使用两个查询是一个坏主意,因为SELECT查询可能需要很长时间才能找到您要查找的行。

答案 3 :(得分:0)

只是对此视而不见......你可能想看看其他答案:

当DBMS系统提供你所提到的“忽略”这样的选项时,他们很可能已经优化了它以获得比你提到的“检查和插入”替代方案更好的性能,因为这是唯一的替代方法,“忽略“必须竞争,如果它不比”检查和插入“更好,那么”忽略“没有任何意义。根据我的经验,当dbms提供的功能时,使用它与手动等效的几乎总是更好。至少,它可以最大限度地减少事务的延迟,最多,它通常在内部进行大量优化以获得更好的效果表现......但同样,事情不能如此广泛地推广,并且必须根据具体情况进行审查......这只是作为指导原则