2010-01-12 127 views
3

用户可以在文本字段中输入关键字并使用逗号分隔这些关键字。
所以输入可能是bananas, apple, orange, pineapple如何处理单个列数据库中的重复条目?

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

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

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

我可以用INSERT IGNORE INTO声明克服错误消息。如果记录是重复的,那么IGNORE关键字告诉MySQL放弃它而不会产生错误。

我的问题是:这是做这件事的好方法吗?或者我应该先检查一下,看看这个关键字是否存在?
我有点思考两个查询与一个。这会影响服务器负载吗?

回答

4

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

插入忽略在理论上是不标准的SQL,但它仍然是非常有用的。如果您需要与其他存储引擎一起使用,那么如果这样的事件发生,您可以改进这些小事情......在这种情况下,无需经过预先移植代码即可。

+1

+1使用“改善” – mozillalives 2010-01-12 19:01:48

+0

大。感谢您确认我的怀疑。不得不谷歌“改善” - 不习惯表达程序员; o)。 – Steven 2010-01-12 19:06:13

0

INSERT IGNORE非常好。我知道的唯一其他语法是REPLACE INTO,但它是用于另一个用例(它删除并插入行,如果它已经存在,这可能会更慢)。

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

1

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

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

这样做的好处是:

  1. 无需INSERT IGNORE - 您的解决方案也适用于其他数据库以及
  2. 以下语句生成,少报表发送,少报表工作MySQL解析 - 更快。
  3. 对于典型的网络应用程序,数据库动作比PHP处理慢,所以它也不会伤害。

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

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

相反的是,很多人认为这是标准的SQL。这样做的好处是,你有一个往返, - 的方式减少开销

+0

输入字符串中的重复项不是问题。问题是如何处理数据库中的重复条目。 – Steven 2010-01-12 19:11:12

+0

但是,多谢'array_unique()'并使用一个INSERT语句。 – Steven 2010-01-12 19:37:30

0

只是采取了盲拍这个......你可能想看看其他的对策:

当DBMS系统提供了类似的选项在你提到的“忽略”中,他们很可能已经优化了它的性能,而不是你提到的“检查和插入”选项,因为这是唯一的替代方法,“忽略”将不得不竞争,如果不是任何比“检查和插入”更好的选择,它没有任何意义去“忽略”。根据我的经验,当有dbms提供的功能时,使用它与使用手动方法相比几乎总是更好。至少,它最大限度地减少了事务的延迟,而且通常会在内部进行大量优化性能......但同样,事情不能一概而论,必须根据具体情况进行检查......这只是作为指导