2015-07-11 2 views
2

Я пишу функцию, которая вставляет пользователя в таблицу MYSQL. Первоначально я написал функцию, чтобы сначала проверить для существующих пользователей с тем же именем пользователя с оператором SELECT. Однако моя таблица указывает, что столбец имени пользователя является уникальным, поэтому я понял, что после проверки, существует ли пользователь, база данных проверяется во второй раз.Тестирование дубликатов в MYSQL путем попытки вставки

Лучше просто вставить строку и посмотреть, есть ли ошибка или явно проверить с помощью инструкции SELECT?

ответ

1

Не зная многое о вашей среде, языка программирования нагрузки, производительности и т.д., я бы сказал, придерживаться того, что заставляет вас чувствовать себя хорошо!

Оба сценария не являются неправильными;)

Думай и код для того, что общий сценарий. Я имею в виду, вы говорите, что это для новых зарегистрированных пользователей. Итак, как часто вы думаете, что пользователь попытается перерегистрироваться? Правильно! В этом случае я мог бы попытаться вставить первый случай.

Считаете ли вы, что у вас будет высокая скорость вставки-неудачи, тогда сначала выберите check-check.

+0

Если бы я ожидал высокой скорости отказа, разве я не хочу избегать дополнительной проверки, чтобы избавиться от накладных расходов? – bytesized

+1

, стоимость выполнения выборочного контроля при сбое с высокой скоростью вставки будет намного проще в этом случае (чем обработка ошибок в движке db, которая может стоить дороже). Все можно измерить, вы можете настроить загрузку и запустить оба сценария, чтобы увидеть поведение вашего db-движка. Как сказано, код для общего сценария, если вы ищете прирост производительности – MrSimpleMind

+0

Интересно. Я не понимал, что обработка ошибок в движке db будет иметь значительные накладные расходы (я думаю, это имеет смысл, хотя). В конечном счете, однако, я предполагаю, что все проверки будут выполнены на стороне клиента (в этом случае через AJAX). Из-за этого я ожидаю низкий уровень сбоев, поэтому я думаю, что сначала буду ВСТАВИТЬ, задавать вопросы позже. – bytesized

0

Я бы выполнил чек с помощью запроса Ajax для лучшего удобства пользователей, если это приложение на базе Интернета.

+0

Я планирую это сделать, но вопрос касался создания пользовательской функции на заднем конце. – bytesized

+0

Если вы подтвердили свой дБ, что имя пользователя не существует, пользователь может отправить форму.В противном случае запретить отправку формы, чтобы у вас была только одна оценка дБ на каждое имя пользователя. Я не верю, что есть необходимость в другой мерах безопасности. –

0

Вы ищете INSERT IGNORE. При повторной вставке первичного ключа он будет генерировать предупреждение вместо ошибки, и вам не нужно будет запускать SELECT для проверки дубликатов.

https://dev.mysql.com/doc/refman/5.5/en/insert.html

+0

Прочитав немного документации, к которой вы привязались, это звучит как противоположность тому, что я хочу. Разве это не мешает точной ошибке, которую я хотел использовать для обнаружения повторяющихся имен пользователей? Похоже, это приведет к тому, что на сервере появится сообщение «Все сделано, ваше имя пользователя существует», когда на самом деле ничего не было сделано. – bytesized

1

Это зависит от того, как вы проводите проверку.

Когда вы делаете select перед insert, у вас есть состояние гонки. Другой пользователь/нить может вставить дублирующую запись междуselect и insert. Вот почему вы хотите сделать чек в insert.

В общем, достаточно выполнить проверку в insert. Если вы хотите избежать ошибки, используйте on duplicate key update. Это предпочтительнее insert ignore, потому что on duplicate key update обрабатывает ошибки, связанные с дублированием ключей. Insert ignore игнорирует все ошибки.

Я бы сказал, что не надо беспокоиться о проверке перед рукой, если у вас нет какой-то определенной причины. Ниже приведены некоторые причины:

  • Вы хотите свести к минимуму время блокировки таблицы, чтобы избежать вопросов, таких как «как долго блокируется таблица при возникновении дубликата?».
  • Преднамеренные дыры в ваших столбцах auto_increment беспокоят вас (на самом деле, я не уверен, что это проблема с MySQL).
  • Вы вставляете несколько строк и хотите обнаруживать несколько дубликатов для отправки отчетов пользователям.
Смежные вопросы