在SQL中检查行的简单方法,如果不存在则添加? (超过100k行)

时间:2013-05-02 19:44:57

标签: php sql

我有一个脚本,如果它不存在,会向SQL添加大约100,000个条目。但是通常需要大约30个小时来完全检查每一行并添加它是否不存在。有更简单的方法吗?

我的代码目前使用for循环,循环内是这个。

$query = mysql_query("SELECT EXISTS (SELECT * FROM linkdb WHERE link='$currentlink')");

if (mysql_result($query, 0) == 1){

}else{
  $qry = "INSERT INTO linkdb(link,title) VALUES('$link','$title')";
  $result = @mysql_query($qry);

}

上面的代码需要很长时间,因为它通常需要经过数千个条目。如果我不首先使用SELECT EXIST检查表并仅使用INSERT INTO,则在1分钟内添加90,000个条目。但是这会添加同一行的重复条目。

请给我一些关于我能做些什么的建议。这些行几乎每天都需要更新。

3 个答案:

答案 0 :(得分:2)

您正在寻找ON DUPLICATE KEY UPDATE。在link上添加索引,然后:

INSERT INTO linkdb(link,title) VALUES('$link','$title') ON DUPLICATE KEY UPDATE link=link;

话虽如此,您不应该使用ext/mysql,因为它已被弃用。而是查看PDOmysqli。最好使用参数化查询来防止SQL注入。

答案 1 :(得分:0)

也许

INSERT INTO ... ON DUPLICATE KEY UPDATE

可以解决您的问题。

答案 2 :(得分:0)

如果您不想在存在重复时更新值,可以将两个查询合并为一个:

INSERT INTO linkdb(link,title)
    select '$link','$title'
    where not exists (SELECT * FROM linkdb WHERE link='$currentlink'))

实际上,您可以通过在linkdb(link)上创建索引来加快上述任何查询。