Например, при вставке записи в таблицу с уникальным индексом, лучше ли сначала протестировать? например ,
$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 ...');
Это зависит от того, хотите ли вы, чтобы значения, которые вы вставляете, не существуют или нет. Если у вас есть уникальный ключ в файле, то важно, чтобы вы не создали дубликат ключа (который вызовет ошибку). Много раз вы тоже хотите проверить, существует ли запись, если это так возвращает первичный ключ записи, чтобы вы могли обновить запись, а затем не вставить запись.
Но если у вас нет уникальных ключей и все равно, если информация дублируется по полю или комбинации полей, тогда это не обязательно и может сэкономить немного времени. Это просто зависит от ситуации.
НТН
Часто зависит от того, какие правила дублирования данных применяются.
В вашем примере, может ли ваше приложение разрешить нескольким пользователям иметь один и тот же адрес электронной почты? Если нет, вам нужно будет выполнить эту проверку.
Вы определенно хотите сначала протестировать, и вы можете протестировать несколько вещей, чтобы вы могли рассказать пользователю, что пошло не так.
Например, я только что закончил работу, когда пользователю нужно уникальное имя пользователя и уникальный адрес электронной почты.