Сайт выдаёт ошибку по ID записи в базе данных — что делать

Если сайт при сохранении записи, импорте или обычной загрузке страницы пишет что-то про дублирующийся ID или «Duplicate entry for key PRIMARY», проблема почти всегда в первичном ключе таблицы MySQL: два ряда пытаются получить один и тот же идентификатор. Чинится это через phpMyAdmin или консоль: находится строка-дубль, удаляется или переносится на свободный ID, после чего счётчик AUTO_INCREMENT сбрасывается на актуальное значение.

Почему ID в базе данных начинает конфликтовать

  • Дамп базы импортировали повторно в те же таблицы, а не в чистую базу
  • После восстановления из бэкапа не сбросили AUTO_INCREMENT, и MySQL пытается выдать уже занятый номер
  • Плагин или скрипт вставляет запись с жёстко заданным ID вместо автоматического
  • Данные переносили между тестовым и рабочим сайтом без учёта разницы в счётчиках

Как найти и убрать дублирующийся ID

Открываете нужную таблицу в phpMyAdmin, сортируете по столбцу с первичным ключом и ищете строки с одинаковым значением — обычно они идут рядом после неудачного импорта. Дубль либо удаляется (если это лишняя копия), либо ему присваивается свободный номер вручную. После этого нужно поправить счётчик, иначе ошибка повторится при следующей вставке:

ALTER TABLE название_таблицы AUTO_INCREMENT = 1000;

Число указывается больше, чем максимальный существующий ID в этой таблице, — его можно посмотреть запросом SELECT MAX(id) FROM название_таблицы.

Что делать, если ошибка вылезает при восстановлении из бэкапа

Импортировать дамп нужно в предварительно очищенную базу, а не поверх текущих данных — иначе старые и новые записи с совпадающими ID столкнутся сразу. Перед импортом стоит также сверить кодировку и collation таблиц: несовпадение иногда даёт похожую ошибку, маскирующуюся под конфликт ключей, хотя на самом деле дело в сравнении строк при вставке.

Если после всех правок сайт продолжает падать на той же таблице, есть смысл сделать свежий бэкап перед любыми изменениями и проверить логи MySQL — там обычно указано точное имя таблицы и значение ID, из-за которого произошёл сбой.

Понравилась статья? Поделиться с друзьями: