Проверьте наличие дубликатов записей и попробуйте / поймайте ограничение уникального ключа - PullRequest
10 голосов
/ 27 марта 2010

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

Мне любопытно, если это плохая практика - НЕ проверять вручную дубликаты записей перед выполнением оператора INSERT для таблицы.

Другими словами, должен ли я выполнить инструкцию SELECT, используя предложение WHERE, которое проверяет дубликаты значений записи, которую я собираюсь вставить. Если запись найдена, не запускайте оператор INSERT, в противном случае продолжите и выполните INSERT ....

OR

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

Я взвешиваю две перспективы и не могу решить, какая из них лучше 1. Не тратьте вызов SELECT для проверки дубликатов, когда я могу просто перехватить исключение VS 2. Не ленитесь, применяя уродливую логику try / catch В.С. 3. Ваши мысли здесь :)

Ответы [ 3 ]

8 голосов
/ 27 марта 2010

Вы действительно должны использовать метод try..catch. Это может быть менее элегантно, но это надежно.

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

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

4 голосов
/ 27 марта 2010

Try / catch безопаснее и масштабируемее, потому что вы будете касаться стола только один раз. Try / catch удаляет откровенно ошибочную обработку ошибок в более ранних версиях

См. урок 4 из этой статьи тоже

4 голосов
/ 27 марта 2010

Даже если вы проверяете наличие дубликатов, новый элемент может быть вставлен после проверки и перед вставкой, поэтому вам все еще нужен блок try / catch.

...