MySQL вставляет дубликаты ключевых обновлений

Im в настоящее время вставляет большое количество (100k +) строк в таблицу следующим образом:

//START of a loop $updatedData[] = '( "'.$field_1.'", "'.$field_2.'", "'.$field_3.'" )'; //END of loop $updatedData = implode(',', $updatedData); $query = "INSERT INTO table (field_1,field_2,field_3) VALUES $updatedData"; 

Это все работает отлично, но теперь я ищу способ обновить строку вместо вставки нового, если $ field_1 и $ field_3 являются дубликатами.

Просто возьмите счетчик ваших $ updatedData.

И запустите это в цикле, это будет работать так, как вы хотите.

Всего наилучшего.

Kanji

Если $ field_1 и $ field_3 являются PRIMARY KEY или UNIQUE тогда вы можете использовать

 $query = "REPLACE INTO table (field_1,field_2,field_3) VALUES $updatedData"; 

–edited–

Чтобы сделать то, что я думаю, что вы ищете, вам нужно что-то вроде этого …

 INSERT INTO table VALUES $updatedData ON DUPLICATE KEY UPDATE field2=VALUES(field2) 

PD: не забывайте о max_allowed_packet для больших запросов.

Вы можете попробовать выполнить обновление следующим образом:

 UPDATE table SET field2 = '$field2' WHERE field1 = '$field1' AND field3 = '$field3' 

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

Если у вас есть какие-либо шансы на котировки в ваших входных данных, вы должны использовать функции для дезинфекции перед построением запроса. Не хотите получать атаки SQL-инъекций из миграции данных.

Обновление: я пропустил, что ваш $updatedData был построен в цикле и удерживал все строки сразу. Мое решение работает только по одной строке за раз. Лучшее, что я могу придумать, – запустить все строки и попробовать обновление, как описано выше. Если число обновленных строк равно нулю, добавьте строку в $updatedData же, как вы добавили в $updatedData в свой вопрос. Затем вы можете сделать массовую вставку в конце, как вы уже работаете.

Я нашел это в документации mysql, не знаю, работает ли она

 UPDATE tbl_name SET fld2 = CASE fld1 WHEN val1 THEN data1 WHEN val2 THEN data2 ELSE fld2 END