Как пропустить дубликаты записей при импорте в phpmyadmin

У меня есть db на моей локальной машине, и я хочу импортировать данные в db на моем хостинге. Оба db идентичны, те же table names, column names и т.д.

Когда я export таблица из моего локального db через phpmyadmin и import через phpmyadmin на моем хостинге появляется ошибка, сообщающая мне, что есть дубликаты записей для primary key и останавливает всю операцию.

Как импортировать данные через phpmyadmin, пропустить дубликаты записей и отобразить список дубликатов в конце процесса?

Решение, которое я могу сделать, это вызвать все значения первичного ключа в db на моем хостинге и фильтровать дубликаты перед импортом. НО мне интересно, есть ли быстрое решение для этого с phpmyadmin?

Ответы

Ответ 1

В phpMyAdmin на вкладке "Параметры" вы можете попробовать проверить следующие значения:

  • Настройки → SQL-запросы → Игнорировать ошибки нескольких операторов

Если вы используете формат CSV:

  • Настройки → Импорт → CSV → Не прерывать ошибку INSERT

Если вы используете формат SQL:

  • Настройки → Экспорт → SQL → Использовать игнорировать вставки

Ответ 2

Существует несколько способов сделать то, что вы хотите:

Брутальный способ:

TRUNCATE TABLE yourTbl; -- emtpies out the table

Затем импортируйте, но вы можете потерять данные, поэтому, возможно, создайте таблицу резервного копирования. Все рассмотренные вещи, просто не делайте этого, проверьте альтернативы, перечисленные ниже:

Напишите свой собственный запрос INSERT с предложением IGNORE:

INSERT IGNORE INTO yourTbl -- as shown in the linked duplicate

Но, поскольку вы импортируете файл, запрос, скорее всего, будет LOAD DATA [LOCAL] INFILE. Как вы можете видеть в руководстве, вы можете легко добавить IGNORE к этому запросу:

LOAD DATA LOCAL INFILE '/path/to/files/filename1.csv' IGNORE -- IGNORE goes here
    INTO TABLE your_db.your_tbl
        FIELDS TERMINATED BY ';'
               OPTIONALLY ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
    (`field1`,`field2`);

Что это. Не беспокойтесь, если вы не слишком удобно писать свои собственные запросы, есть другие способы делать то, что вы хотите:
Способ CLI:

mysqlimport -i dbname fileToImport
# Or
mysqlimport --ignore dbname fileToImport

Также CLI, создайте файл, содержащий запрос LOAD DATA выше, а затем:

$: mysql -u root -p
*********** #enter password
mysql> source /path/to/queryFile.sql

Для этого вам необходимо иметь доступ к командной строке и запустить эту команду Здесь страница руководства MySQL

Используя phpMyAdmin, при импорте вы найдете флажок "Игнорировать дубликаты", проверьте его и импортируйте. Здесь страница со скриншотами
Вы также можете выбрать "Игнорировать ошибки", но это еще один подход грубой силы, и я бы не рекомендовал этого.