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

3
一个用户可以在文本框中输入关键字,并使用逗号将其分开。因此,输入可能是“香蕉,苹果,橙子,菠萝”。
在我的数据库中,我有一个名为“keyword”的表,它只有一个列“keyword”,也是主键。
通过“$myArray = expload(',', $keywords)”将关键字添加到数据库中。然后,我循环遍历数组并执行“INSERT INTO myTable”的操作。
现在,如果关键字已经存在,我会收到错误消息。
我可以通过使用“INSERT IGNORE INTO”语句来克服错误消息。如果记录是重复的,则IGNORE关键字告诉MySQL在不生成错误的情况下默默地丢弃它。
我的问题是:这样做好吗?还是应该先检查关键字是否存在?我在考虑两个查询与一个查询。这会影响服务器负载吗?
4个回答

4

插入忽略是非常好的,一举两得。

虽然插入忽略在理论上不是标准的SQL,但它仍然非常有用。如果您需要使用其他存储引擎,如果发生这种情况,您可以改善这些小问题...在这种情况下,无需费力地预先移植您的代码。


太好了。谢谢你确认了我的怀疑。不得不谷歌“ameliorate” - 不习惯这样表达的程序员; o)。 - Steven

1

虽然出于原则考虑,我不会阻止使用INSERT IGNORE,但在这种情况下,我认为有一些实际的考虑因素。

如果您在发送之前去重数组,速度会更快。看起来您正在使用PHP - 您可以使用array_unique()进行去重。(请参见http://nl2.php.net/manual/en/function.array-unique.php

这样做的好处是:

  1. 无需INSERT IGNORE - 您的解决方案也适用于其他数据库
  2. 生成的语句更少,发送的语句更少,MySQL解析的语句更少 - 更快。
  3. 对于典型的Web应用程序,数据库操作比PHP处理慢,因此也不会有影响。

我建议的另一件事是像这样生成一个大的INSERT语句:

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

与许多人的想法相反,这是标准SQL。这样做的好处是你只需要一次往返,开销更小。

输入字符串中的重复不是问题。问题在于如何处理数据库中的重复条目。 - Steven
但感谢您提供有关array_unique()和使用一个INSERT语句的提示。 - Steven

0

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

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


0

只是瞎猜一下...你可能想看看其他回答:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接