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

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

$mysqli->query('SELECT email FROM tblUser WHERE email = '[email protected]');

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

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

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

БЛАГОДАРНОСТЬ!

Чтобы уточнить: значение должно быть уникальным, И таблица имеет уникальный индекс - попытка вставить повторяющийся ключ приведет к ошибке. БЛАГОДАРНОСТЬ!

PartialOrder 13.01.2009 21:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
1
4 326
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

"INSERT INTO table (name, email) VALUES ('bob', '[email protected]') ON DUPLICATE KEY UPDATE ..."

Ry Biesemeyer 14.01.2009 00:08

Да, я знаю, как использовать синтаксис ON DUPLICATE KEY, но OP не сказал, что хочет обновить в случае дублирования.

Bill Karwin 14.01.2009 00:28

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

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

HTH

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

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

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

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

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

Или определите столбец электронной почты как уникальный ключ. Затем вы может запускаете INSERT без предварительной проверки. В сообщении об ошибке будет указано, в каком столбце произошел сбой.

Ben Blank 13.01.2009 21:46

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

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

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

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

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

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

Другие вопросы по теме