Например, при вставке записи в таблицу с уникальным индексом лучше всего сначала протестировать? например,
$mysqli->query('SELECT email FROM tblUser WHERE email = '[email protected]');
затем убедитесь, что возвращено 0 строк, тогда выполняет вставку?
$mysqli->query('INSERT INTO tblUser ...');
Или лучше просто пропустить тест и обработать ошибку в случае повторяющейся записи?
БЛАГОДАРНОСТЬ!






Лучше вставлять и обрабатывать любые повторяющиеся ключевые ошибки.
Причина в том, что если вы сначала протестируете, какой-то другой клиент все еще может вставить значение в короткий момент между вашим тестом и вашей вставкой. Так что вам все равно придется обрабатывать ошибки.
"INSERT INTO table (name, email) VALUES ('bob', '[email protected]') ON DUPLICATE KEY UPDATE ..."
Да, я знаю, как использовать синтаксис ON DUPLICATE KEY, но OP не сказал, что хочет обновить в случае дублирования.
Это зависит от того, хотите ли вы убедиться, что вставляемые вами значения не существуют или нет. Если у вас есть уникальный ключ в файле, важно, чтобы вы не создавали дубликат ключа (что приведет к ошибке). Часто вы также хотите проверить, существует ли запись, если да, возвращая первичный ключ записи, чтобы вы могли обновить запись, а если нет, то вставьте запись.
Но если у вас нет уникальных ключей и вам все равно, дублируется ли информация в поле или комбинации полей, тогда в этом нет необходимости и можно сэкономить немного времени. Это просто зависит от ситуации.
HTH
MySQL поддерживает игнорирование вставки, если вы хотите игнорировать вставку, которая создает строку, значение ключа которой уже существует для другой строки.
Просто убедитесь, что в tblUser есть уникальный индекс электронной почты, и выполните
$mysqli->query('INSERT IGNORE INTO tblUser ...');
Часто зависит от того, какие правила о дублировании данных применяются.
В вашем примере разрешает ли ваше приложение нескольким пользователям иметь один и тот же адрес электронной почты? В противном случае вам нужно будет выполнить эту проверку.
Или определите столбец электронной почты как уникальный ключ. Затем вы может запускаете INSERT без предварительной проверки. В сообщении об ошибке будет указано, в каком столбце произошел сбой.
Вы определенно хотите сначала протестировать, и вы можете протестировать несколько вещей, чтобы вы могли сказать пользователю, что пошло не так.
Например, я только что закончил работу, где пользователю требовалось уникальное имя пользователя и уникальный адрес электронной почты.
Вообще говоря, есть три способа справиться с этой ситуацией с помощью одного запроса (меньшее количество запросов обычно лучше), но ни один из них не является универсальным «лучшим способом». Что вам следует использовать, зависит от ваших потребностей.
Первый - это, как вы упомянули, слепой запуск INSERT … и обработка любых ошибок PHP. Это лучший подход, когда повторяющийся ключ указывает на процедурную проблему (ошибка в программном обеспечении, пользователь пытается зарегистрировать уже использованное имя и т. д.), Поскольку он позволяет выполнять дополнительные операции перед фиксацией обновления базы данных. .
Во-вторых, это синтаксис INSERT IGNORE …. Я бы назвал это наименее часто используемым подходом, так как он полностью отбрасывает ваш INSERT, если ключ уже существует. В первую очередь полезно, когда строка (или строки) могла или не могла быть добавлена в таблицу ранее, но известно, что данные не изменились.
Наконец, вы можете использовать инструкцию INSERT … ON DUPLICATE KEY UPDATE …. Они могут быть довольно подробными, но очень удобны, поскольку позволяют вставлять данные в таблицу, не беспокоясь о существовании более старых данных. Если да, то существующая строка обновляется. Если нет, вставляется новый. В любом случае в вашей таблице будут самые свежие данные.
Чтобы уточнить: значение должно быть уникальным, И таблица имеет уникальный индекс - попытка вставить повторяющийся ключ приведет к ошибке. БЛАГОДАРНОСТЬ!