2010-09-11 67 views
0

我有一个数组我想检查数据库中是否存在用户名和电子邮件值,如果它不存在,请在数据库中插入用户名和电子邮件值。使用多插入,因为有大约80000插入被执行。阵列多插入uname和电子邮件检查

$arr1 = Array 
(
    [0] => Array  ([Username] => uname1, [Email] => email1 ) 

    [1] => Array ( [Username] => uname2, [Email] => email2 ) 

    [2] => Array ( [Username] => uname3, [Email] => email3) 

) 
+0

问题是什么? – HoLyVieR 2010-09-11 21:37:43

+0

使用多插入在数据库中插入数组,它还应该检查uname和电子邮件是否已存在 $ arr1 =数组 ( [0] => Array([Username] => uname1,[Email] => email1 ) [1] =>数组([用户名] => uname2,[电子邮件] => EMAIL2) [2] =>数组([用户名] => uname3,[电子邮件] => EMAIL3) ) – 2010-09-11 21:46:16

回答

1

与80000 INSERT秒的SQL语句的功能将慢于80000个单独INSERT S,因为单片,多INSERT SQL语句字符串不会需要建立。要覆盖现有的行,您需要一个主键来确保覆盖重复的记录:http://dev.mysql.com/doc/refman/5.1/en/replace.html

foreach ($arr1 as $user){ 
    $sql = "REPLACE INTO `users` SET `Username`='" . mysql_escape_string($user["Username"]) . "', `Email`='" . mysql_escape_string($user["Email"]) . "'"; 
    mysql_query($sql); 
} 

我的代码假设Username是主键。如果不是,请添加到SET子句以包含主键。如果Username是您的主键,请考虑使用基于整数的键作为基于字符串的主键速度较慢。

0

最简单的方法是在用户名+电子邮件上创建唯一索引。然后你可以做一个INSERT IGNORE。尽管您可能不想使用PHP批量插入80000条记录,除非您还调整超时参数。最好一次将它分成500个批量的插入内容。那么它会很好地扩展。

将INSERT IGNORE与唯一索引一起使用只会插入索引中尚未匹配的记录。不要做单个插入和/或查找。虽然这将会扩大,但速度会很慢。将您的数据分块,它的规模和表现会很好。