用户可以在文本字段中输入关键字,并使用逗号分隔键
所以输入可能是bananas, apple, orange, pineapple
。
在我的数据库中,我有一个名为keyword
的表,它只有一列keyword
也是主键。
我通过$myArray = expload(',', $keywords)
将关键字添加到数据库中
然后我遍历数组并执行`INSERT INTO myTable'。
现在,如果关键字已经存在,我将收到一条错误消息。
我可以使用INSERT IGNORE INTO
语句来克服错误消息。如果记录是重复的,则IGNORE关键字告诉MySQL以静默方式丢弃它而不会产生错误。
我的问题是:这是一个很好的方法吗?或者我应该首先检查关键字是否存在? 我有点想两个问题而不是一个。这会影响服务器负载吗?
答案 0 :(得分:4)
插入忽略是伟大的,它一石二鸟。
插入ignore理论上是非标准的sql,但它仍然非常有用。如果你需要使用其他存储引擎,你可以改善这些小事情,如果这样的事件发生了......在这种情况下不需要通过箍来预先移植你的代码。
答案 1 :(得分:1)
虽然在这种情况下我不会因为主要原因而不鼓励使用INSERT IGNORE
,但我认为这里有一些实际的考虑因素。
我认为如果你在发送之前对数组进行重复数据删除会更快。我看起来你正在使用PHP - 你可以使用array_unique()
进行重复数据删除。 (见http://nl2.php.net/manual/en/function.array-unique.php)
这样做的好处是:
INSERT IGNORE
- 您的解决方案也适用于其他数据库我建议的另一件事是生成一个大的INSERT
语句,如下所示:
$sql = INSERT INTO tab (keyword) VALUES ('word1'), ('word2'), ...
与许多人认为这是标准SQL的情况相反。这样做的好处是你可以进行一次往返, - 减少开销
答案 2 :(得分:0)
INSERT IGNORE
完全没问题。我知道的唯一其他语法是REPLACE INTO
,但它适用于另一个用例(如果已经存在,则删除并插入该行,这可能更慢)。
使用两个查询是一个坏主意,因为SELECT
查询可能需要很长时间才能找到您要查找的行。
答案 3 :(得分:0)
只是对此视而不见......你可能想看看其他答案:
当DBMS系统提供你所提到的“忽略”这样的选项时,他们很可能已经优化了它以获得比你提到的“检查和插入”替代方案更好的性能,因为这是唯一的替代方法,“忽略“必须竞争,如果它不比”检查和插入“更好,那么”忽略“没有任何意义。根据我的经验,当dbms提供的功能时,使用它与手动等效的几乎总是更好。至少,它可以最大限度地减少事务的延迟,最多,它通常在内部进行大量优化以获得更好的效果表现......但同样,事情不能如此广泛地推广,并且必须根据具体情况进行审查......这只是作为指导原则