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