MySQL вставка без дублирования

Mysql_Logo8

Часто возникает ситуация, когда необходимо избежать дублирования строк в таблице. В таких случаях, я, как правило, прибегаю к такому способу. Интересующие поля объявляются UNIQUE KEY (или, иногда, PRIMARY KEY), что, естественно, приводит к невозможности вставки строк с повторяющимися ключевыми полями. Но при такой попытке в php будет возникать Database Exception. Делать предварительный SELECT, чтобы убедиться, что записи с таким ключевым полем в таблице еще нет расточительно с точки зрения ресурсов сервера БД. Сразу возникает идея обернуть запрос к БД в try catch блок, и просто не обрабатывать пойманные Exception’ы, но это приведет к невозможности отследить и важные ошибки, типа некорректных данных в запросе или невозможности выполнить запрос вследствие недоступности или перегруженности MySQL сервера.

Следующей моей идеей было использовать конструкцию

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

В итоге я остановился на таком варианте команды INSERT:

Лишних Database Exception нет, при попытке вставить строку с дублирующимися данными ключевого поля апдейта как такового не происходит

Т.е. БД нагружаем минимально.

Если же нужно обновить какое-то поле при возникновении дублирования (например, datetime поле, чтобы пометить запись актуальным временем) делаю так

где VALUES(date_field) поставляет значение из INSERT части выражения, т.е., в данном случае ‘2015-08-25 12:35:00’