数组多插入uname和电子邮件检查

时间:2010-09-11 21:34:14

标签: php sql

我有一个数组我想检查数据库中是否存在用户名和电子邮件值,如果不存在则在数据库中插入用户名和电子邮件值。使用Multi insert,因为有大约80000个插件可以预先形成。

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

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

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

)

2 个答案:

答案 0 :(得分:1)

具有80000 INSERT s的SQL语句的运行速度将低于80000个单独的INSERT,因为不需要构建单一的多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是您的主键,请考虑使用基于整数的键,因为主键很慢。

答案 1 :(得分:0)

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

将INSERT IGNORE与唯一索引一起使用只会插入索引中尚未匹配的记录。不要进行单次插入和/或查找。虽然这会扩展,但它会很慢。数据块,它将扩展并表现良好。