Думаю многим знакома такая ситуация, когда вроде всё корректно написано, но MySQL возвращает ошибку Error: Duplicate entry ‘XXX’ for key ‘YYY’ и записи не вставляет. XXX и YYY у каждого могут быть свои (в зависимости от структуры базы данных, построения индексов и т.д. и т.п., а вот решение проблемы одно для всех, или даже два).

Вставка записей в без MySQL Duplicate entry for key

Решение 1. Игнорируем ошибку MySQL Duplicate entry for key

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

Тогда на помощь прийдет замена команды «INSERT» на модифицированную команду «INSERT IGNORE». При этом запросы продолжат выполнятся даже если где-то в запросах возникла ошибка Duplicate entry. На примере:

INSERT INTO table_name (f1, f2) VALUES ('v1', 'v2')

//Заменим на 

INSERT IGNORE INTO table_name (f1, f2) VALUES ('v1', 'v2')

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

Решение 2. Обновление данные записи при дублировании

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

Как это сделать?

Нужно свой обычный insert дополнить строкой:

INSERT INTO table_name (f1, f2) VALUES ('v1', 'v2') ON DUPLICATE KEY UPDATE f1='v1', f2='v2'

Всё просто. Этот способ более безопасен, так как мы точно знаем что произойдет (и посторонние ошибки в запросах по прежнему будут обрабатываться, мы просто исключим из них ошибку о дубликатах записей Duplicate entry.

Вся информация об этих запросах (устраняющих ошибку mysql duplicate entry for key) доступна на сайте документации MySQL: Синтаксис MySQL Insert