Обновление нескольких строк

#mysql #sql #sql-update

#mysql #sql #sql-обновление

Вопрос:

У меня возникла проблема с обновлением нескольких строк таблицы mysql с использованием одного оператора mysql.

У меня есть идентификаторы строк, которые я хочу обновить в строке, например.

 $ids="id1, id2, id3, id4,...."
  

и у меня есть мои значения в другой строке, например.

 $values="str1, str2, str3, str4,....";
  

(у меня есть более 30 000 строк для обновления)

Идея в том, что строка с id1 должна быть обновлена с помощью str1 и так далее.

Как я могу это исправить?

Спасибо

Комментарии:

1. разбейте эти 2 строки на массивы и с помощью цикла foreach обновите базу данных

2. мне нужно обновить более 30 000 строк …. это означает выполнение более 30 000 запросов. Есть ли лучшее решение?

3. Вам определенно следует выполнить пакетное обновление. Но я не знаю как. Возможно, вы можете использовать LOAD DATA и ОБНОВЛЯТЬ ДУБЛИКАТЫ. Но для этого потребуются исследования и тестирование.

4. 30 000 строк не должны быть ТАКИМИ уж плохими, если вы группируете их в транзакции (т. Е. Не выполняйте фиксацию для каждого оператора, выполняйте фиксацию каждые 100 вставок или что-то в этом роде). Предполагая, что вы используете InnoDB здесь.

Ответ №1:

Это будет очень уродливый запрос, но…

 update table
set    str = case id
             when id1 then str1
             when id2 then str2
             ...
             end
where  id in (id1, id2, ...)
  

Комментарии:

1. Соберите этот запрос в виде строки в цикле for и запустите запрос один раз.

2. Мне интересно, как MySQL справится с таким длинным запросом. 😀

Ответ №2:

Создайте временную таблицу с двумя столбцами, id и str, и выполните очень длинную

 INSERT INTO temptable VALUES (id1,str1),(id2,str2)...(idn,strn);
  

Вы создаете строку в цикле for, не обращаясь к базе данных. Затем вы выполняете одно UPDATE присоединение к временной таблице очевидным способом. (Индексация временной таблицы может помочь, а может и не помочь.)

Вы не хотите совершать 30 ТЫСЯЧ обходов в БД. (С другой стороны, вам, возможно, придется разделить INSERT , если вы столкнетесь с проблемами максимальной длины строки.)