Эффективный способ проверить уникальность записи во время массовой вставки в MySql - PullRequest
1 голос
/ 31 октября 2019

Я вставляю 1000 или более записей в таблицу MySQL одним запросом. Я генерирую запрос через цикл PHP, который выглядит примерно так:

INSERT INTO `favorite_colors` (`ID`, `person_id`, `email`)
VALUES
(1, 1, '1@yellow.com'),
(2, 1, '2@yellow.com'),
(3, 2, '2@blue.com'),
(4, 2, '2@blue.com'),
(5, 3, '1@green.com');

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

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

Я предполагаю, что вы получаете элементы из некоторой структуры, то есть массива:

$rec = ['ID' => 1, 'person_id' => 1, 'email' => '1@yellow.com'];

Таким образом, вы можете создать некоторый управляющий массив:

$added = [];

Затем для каждой записи вы присоединяете поля:

$line = $rec['ID'] . '_' . $rec['person_id'] . "_" . $rec['email'];

Предполагая, что ID и person_id являются целыми числами, вы гарантируете уникальность с подчеркиванием.

Затем вы проверяете:

if(!isset($added[$line])) {
    $added[$line] = true;

    // proceed insert here
}

Вы также можете попытаться преобразовать строку $ в какой-то уникальный хэш

0 голосов
/ 31 октября 2019

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

$already_done = array();
foreach ($csvRecords as $record)
{
   $unique_hash = md5($record['person_id'].$record['email']);
   if (!in_array($unique_hash, $already_done))
   {
      $already_done[] = $unique_hash;
      // create sql insert query here
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...