Я думаю лучшее, которое можно сделать, в этом случае должен взять их вход и затем показать им, что Вы думаете, что они имели в виду. Если они не соглашаются, покажите им формат, Вы ожидаете и заставляете их вводить его снова.
Альтернатива ON DUPLICATE KEY UPDATE
позволяет вам ссылаться на решение об обновлении и вставке в базу данных:
INSERT INTO table (userid, name) VALUES (2, 'Bobby');
ON DUPLICATE KEY UPDATE name = 'Bobby';
обновит поле имени на «Бобби», если запись с идентификатором пользователя 2 уже существует.
Вы можете использовать его как альтернативу INSERT IGNORE
, если вы укажете неэффективную операцию для UPDATE:
INSERT INTO table (userid, name) VALUES (2, 'Bobby');
ON DUPLICATE KEY UPDATE name = name;
Это ничего не даст, если идентификатор пользователя 2 уже существует , таким образом избегая предупреждения и игнорирования других ошибок, которые могут возникнуть при использовании INSERT IGNORE
.
Другой альтернативой будет REPLACE
:
REPLACE INTO table (userid, name) VALUES (2, 'Bobby');
Это будет обычная вставка, если идентификатор пользователя 2 еще не существует. Если он существует, он сначала удалит старую запись, а затем вставит новую.
Имейте в виду, что обе версии являются специфическими для MySQL расширениями SQL.
В цикле вы можете сначала выполнить обновление, если ни одна строка не затронута, это означает, что это новая запись. Отслеживайте эти «неудачные обновления», а затем вставляйте их как новые записи.
Я не знаком с Zend_Db, но предполагаю, что он может вернуть, повлияло ли обновление на количество строк.
Вам нужно определить ИД пользователя как ПЕРВИЧНЫЙ или УНИКАЛЬНЫЙ ключ и использовать что-то вроде:
INSERT IGNORE INTO table (userid, name) VALUES (2, 'Bob');
Если ИД пользователя 2 уже существует, он проигнорирует и перейдет к следующей вставке.
Вы также можно использовать ON DUPLICATE KEY UPDATE в схеме таблицы. Другой альтернативой может быть использование синтаксиса REPLACE INTO.
REPLACE INTO table (userid, name) VALUES (2, 'Bob');
Будет предпринята попытка INSERT, если запись уже существует, она будет УДАЛЕНА перед повторной INSERT.