MySQL Вставить: сначала проверить?

Например, при вставке записи в таблицу с уникальным индексом, лучше ли сначала протестировать? например ,

$mysqli->query('SELECT email FROM tblUser WHERE email = 'foo@bar.org'); 

затем убедитесь, что 0 строк возвращены, а затем вставить?

 $mysqli->query('INSERT INTO tblUser ...'); 

Или лучше просто пропустить тест и обработать ошибку в случае дублирования записи?

БЛАГОДАРЯ!

Лучше вставлять и обрабатывать любые повторяющиеся ключевые ошибки.

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

Вообще говоря, есть три способа справиться с этой ситуацией с помощью одного запроса (меньшее количество запросов обычно хорошо для съемки), но ни один из них не является универсальным «лучшим способом». Что вы должны использовать, зависит от ваших потребностей.

Во-первых, как вы упомянули, запуск INSERT … слепо и обработка любых ошибок PHP. Это лучший подход, когда дублирующий ключ указывает на процедурные проблемы (ошибка в программном обеспечении, пользователь, пытающийся зарегистрировать имя, которое уже было использовано, и т. Д.), Поскольку он позволяет выполнять дополнительные операции перед выполнением обновления базы данных ,

Во-вторых, есть синтаксис INSERT IGNORE … Я бы назвал это наименее общепринятым, поскольку он полностью отбрасывает ваш INSERT если ключ уже существует. В первую очередь полезно, когда строка (или строки) может быть добавлена ​​или не добавлена ​​ранее в таблицу, но данные, как известно, не изменились.

Наконец, вы можете использовать INSERT … ON DUPLICATE KEY UPDATE … Они могут быть довольно подробными, но очень удобны, поскольку они позволяют вставлять данные в таблицу, не беспокоясь о том, существуют ли более старые данные. Если это так, обновляется существующая строка. Если нет, то новый. В любом случае, ваша таблица будет иметь самые последние доступные данные.

MySQL поддерживает вставку ignore, если вы хотите игнорировать вставку, которая создает строку с ключевым значением, которое уже существует для другой строки.

Просто убедитесь, что есть уникальный индекс по электронной почте в tblUser и делайте

 $mysqli->query('INSERT IGNORE INTO tblUser ...'); 

Это зависит от того, хотите ли вы, чтобы значения, которые вы вставляете, не существуют или нет. Если у вас есть уникальный ключ в файле, то важно, чтобы вы не создали дубликат ключа (который вызовет ошибку). Много раз вы тоже хотите проверить, существует ли запись, если это так возвращает первичный ключ записи, чтобы вы могли обновить запись, а затем не вставить запись.

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

НТН

Часто зависит от того, какие правила дублирования данных применяются.

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

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

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