MySQL Insert: сначала проверить? - PullRequest
6 голосов
/ 13 января 2009

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

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

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

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

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

СПАСИБО!

Ответы [ 6 ]

11 голосов
/ 13 января 2009

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

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

7 голосов
/ 13 января 2009

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

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

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

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

1 голос
/ 13 января 2009

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

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

$mysqli->query('INSERT IGNORE INTO tblUser ...');
0 голосов
/ 13 января 2009

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

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

0 голосов
/ 13 января 2009

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

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

0 голосов
/ 13 января 2009

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

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

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...