Что делать при ошибке MySQL #1062 — «Дублирующаяся запись '??????' по ключу 'PRIMARY'?

Пытаюсь через админ-панель на PHP загрузить уже существующую базу данных на хостинг, но при импорте появляется ошибка (см. скриншот). Форум phpBB на хостинге уже установлен; я хочу подгрузить старую базу, чтобы не переносить все сообщения вручную. <br/> <br/> Как можно исправить эту ошибку и вообще возможно ли выполнить импорт в такой ситуации? Также читала про использование IGNORE для пропуска дублирующихся строк — куда в SQL-запросе нужно вставить эту команду, пока я только осваиваю MySQL? <br/>
  • 16 февраля 2026 г. 13:01
Ответы на вопрос 2
Ошибка MySQL #1062 — «Duplicate entry ... for key 'PRIMARY'» означает, что в импортируемом INSERT пытаются вставить строку с таким же значением первичного ключа (обычно id), какое уже есть в таблице на хостинге. Проще говоря — таблица не пустая, и новые строки конфликтуют по PRIMARY KEY.

Варианты решения (выберите тот, что подходит вам):

1) Если вы хотите полностью заменить текущую базу на хостинге
- Сначала сделайте резервную копию текущей БД (экспорт).
- Удалите/очистите таблицы на хостинге (phpMyAdmin: выбрать БД → отметить все таблицы → «Drop» или «Empty»).
- Затем импортируйте ваш SQL-файл. Если при экспорте вашего старого БД был включён параметр «Add DROP TABLE / IF EXISTS», то при импорте старые таблицы будут удалены автоматически и создана ваша версия.

2) Если вы хотите «слиять» данные, пропуская дубли
- В SQL-файле заменить команды INSERT на INSERT IGNORE:
  Пример:
  INSERT INTO `phpbb_posts` (...) VALUES (...);
  заменить на
  INSERT IGNORE INTO `phpbb_posts` (...) VALUES (...);

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

3) Если вы хотите заменить существующие строки новыми (перезаписать)
- Использовать REPLACE INTO:
  REPLACE INTO `table` (...) VALUES (...);
  REPLACE удалит существующую строку с таким же PRIMARY KEY и вставит новую. Внимание: это фактически DELETE + INSERT — могут нарушиться внешние ключи, изменится AUTO_INCREMENT и т.п.
- Или использовать INSERT ... ON DUPLICATE KEY UPDATE, если хотите обновлять только некоторые поля:
  INSERT INTO `table` (id, col1, col2) VALUES (1, 'a', 'b')
  ON DUPLICATE KEY UPDATE col1=VALUES(col1), col2=VALUES(col2);

4) Если есть проблемы с зависимостями/порядком создания таблиц (FOREIGN KEY)
- Во время импорта можно временно отключить проверку внешних ключей:
  SET FOREIGN_KEY_CHECKS=0;
  -- импорт данных
  SET FOREIGN_KEY_CHECKS=1;
  Это помогает, если импорт идёт не в том порядке, но не решает конфликты по PRIMARY KEY.

Практика: куда вставлять IGNORE / REPLACE
- Вы редактируете ваш SQL-файл (текстовый), и везде где встречается "INSERT INTO `...`" делаете замену на "INSERT IGNORE INTO `...`" или на "REPLACE INTO `...`".
- Можно это сделать в любом текстовом редакторе или через команду sed на сервере.

Полезные советы и предостережения
- Всегда делайте бэкап текущей БД перед импортом.
- INSERT IGNORE может скрыть и другие ошибки (пропустит строки с нарушениями), так что после импорта проверьте логи/количество вставленных строк.
- REPLACE может нарушить связи и изменить поведение форумного ПО, поэтому для phpBB будьте осторожны.
- Если ваш SQL большой и phpMyAdmin не загружает его, используйте командную строку mysql или скрипт BigDump.
- Символы «????» в ошибке скорее всего — проблема с кодировкой (UTF-8 vs cp1251). Убедитесь, что при экспорте/импорте указана правильная кодировка (SET NAMES utf8; или выбрать правильную кодировку в phpMyAdmin).

Резюме простых шагов для начинающего
1. Сделать экспорт текущей БД хостинга (резерв).
2. Если хотите полностью заменить — удалить таблицы на хостинге и импортировать ваш файл.
3. Если хотите только дописать, редактируйте SQL: замените "INSERT INTO" → "INSERT IGNORE INTO" и импортируйте.
4. Если хотите перезаписать — используйте REPLACE INTO (но имейте в виду побочные эффекты).

Если пришлёте маленький фрагмент вашего SQL-файла (несколько строк INSERT), покажу точную замену/пример.
IGNORE вписывается сразу после INSERT: Во всех SQL-командах меняем "INSERT ..." на "INSERT IGNORE...". Но причина совсем не в этом... <br/> <br/> Знаки вопроса вместо текста - вероятнее всего, на хостинге неправильно настроена кодировка созданной базы данных и вместо нормальных текстов в базе сохраняются знаки вопросов, что и приводит к "дублированию". Либо неправильно настроена кодировка в PHP-коде при подключении к базе данных (с тем же эффектом). И начинать надо с проверки этих кодировок.
Похожие вопросы