Самый быстрый способ проверить предыдущую запись перед вставкой

Мой вопрос будет использовать электронные письма в качестве примера, но это может быть применимо ко всему.


Обычно, прежде чем регистрировать нового пользователя (включая вставку его / ее электронной почты), я проверяю, существует ли его / ее электронная почта в БД примерно так:

$result = mysql_query("SELECT * FROM Users WHERE email = '".mysql_real_escape_string($email)"';"); if(!$result) { die(mysql_error()); } if(mysql_num_rows($result) > 0) { die('<p>Email already in DB. <a....>Recover Email</a></p>'); } else { //insert new user data into Users table } 

Так как я бы ограничил поле email в моей таблице «Пользователи», чтобы быть UNIQUE любом случае, не было бы быстрее попытаться вставить сначала, и если это не сработает, проверьте ошибку? Что-то вроде этого:

 $result = mysql_query(...);//insert new user data into Users table if(!$result) { if(mysql_errno()==$insert_unique_error) { $error = '<p>Email already in DB. <a....>Recover Email</a></p>'; } else { $error = mysql_error(); } die($die_str); } 

Проблема в том, что я не знаю, что такое $insert_unique_error . Это единственные коды ошибок, которые я могу найти :

Первые два символа значения SQLSTATE указывают на класс ошибки:

Класс = '00' указывает на успех.

Класс = '01' указывает на предупреждение.

Класс = '02' означает «не найден». Это актуально в контексте курсоров и используется для управления тем, что происходит, когда курсор достигает конца набора данных. Это условие также возникает для операторов SELECT … INTO var_list, которые не извлекают строки.

Класс> '02' указывает на исключение.

Solutions Collecting From Web of "Самый быстрый способ проверить предыдущую запись перед вставкой"

использование

 INSERT IGNORE INTO Users VALUES(...); 

с уникальным ключом в поле электронной почты, а затем проверить количество строк с помощью mysql_affected_rows ();

Это приведет к одному запросу к БД и исключению условия гонки временного окна между SELECT и INSERT

Я считаю, что COUNT – один из самых быстрых методов. Также помните, когда делаете свои запросы, если вы хотите протестировать его существование, не делайте

 SELECT * 

Вместо этого укажите конкретное поле

 SELECT id 

Таким образом, вы не получаете столько данных. В случае использования COUNT:

 SELECT COUNT(id) FROM Users WHERE email = 'emailaddress' 

См. Ниже ссылку о том, как использовать COUNT в результирующем наборе

http://www.tizag.com/mysqlTutorial/mysqlcount.php