Многократная вставка MySQL, когда дубликаты не допускаются. - PullRequest
6 голосов
/ 13 февраля 2012

У меня есть таблица с 3 столбцами.У каждого есть уникальный индекс.

Я хотел бы сделать несколько вставок одновременно (300 записей в поп).Когда появляется повторяющаяся запись, она полностью отменяет вставку.Это означает, что если 1 из 300 является дубликатом, ни один из них не будет вставлен.

Есть ли способ обойти это?

Ответы [ 4 ]

8 голосов
/ 13 февраля 2012

Попробуйте изменить запрос с INSERT INTO ... на INSERT IGNORE INTO ....Это приведет к тому, что любые ошибки станут предупреждениями, и ваши другие записи должны быть вставлены.

1 голос
/ 13 февраля 2012

Если ваши вставки являются идемпотентами, update or replace поможет вам.

Учитывая, что они, скорее всего, нет, не существует какого-либо сверхэффективного способа сделать это без каких-либо отступлений от вставки отдельных строк в качестве запасного варианта - для выделения проблемной строки.

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

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

0 голосов
/ 13 февраля 2012

Вы можете использовать что-то вроде этого:

  INSERT INTO table (username, id)
          VALUES
          ('john', 1),
          ('jim', 2),
          ('mary', 3),
          ('jack', 4),
          ('helen', 4) ON DUPLICATE KEY IGNORE 

Если вы хотите заменить запись, используйте UPDATE вместо IGNORE.

0 голосов
/ 13 февраля 2012

Используйте транзакцию: http://dev.mysql.com/doc/refman/5.0/en/commit.html

START TRANSACTION // DO QUERIES COMMIT

Если что-то пойдет не так в DO QUERIES, ни одна из записей не будет зафиксирована.

Если вы хотите игнорировать ошибки.используйте --force из командной строки mysql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...