Ошибка 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), покажу точную замену/пример.