Метод: insert duplicate key update в MySQL

MYSQL+DB[1]Сегодня я расскажу про небольшой нюанс в работе с MySQL. Многим известен метод перехвата ошибки duplicate key при вставке (insert) записи в таблицу. То есть когда скрипт пытается добавить новую запись в таблицу, но запись с этим primary ключем уже создана, MySQL выбрасывает ошибку duplicate key. В методе insert эту ошибку можно перехватить и запрос будет примерно таким:

INSERT INTO `users` SET `email` = 'email@domain.com' ON DUPLICATE KEY UPDATE `email` = 'email@domain.com';

В этом случае, если в таблице users уже есть запись с вставляемым email’ом, то сам запрос перехватит эту ошибку и просто обновит данные записи. Если далее выбрать эту запись, то ничего не изменится, кроме тех данных, которые были обновлены.

Однако есть один нюанс. Инкеремент primary key (если первичный ключ указан как int) увеличиться на единицу.

К примеру в базе у вас такие данные:

±-----±------------------+
| id | email |
±-----±------------------+
| 9870 | vasya@mail.ru |
| 9871 | petya@mail.ru |
| 9872 | super4@yandex.ru |
| 9873 | alekss@yandex.ru |
| 9874 | aleksei@mail.ru |
±-----±------------------+

Теперь сделаем insert с перехватом update для записи 9872 и обновим какие-то другие данные.

Теоретически, следующая новая запись при вставке в таблицу должна получить id 9875. Однако запись будет с идентификатором 9876 из-за метода insert update.

Учитывайте этот нюанс при проектировании базы.

Запись навигация

Top