Обновление нескольких строк одним запросом

Как я могу обновить сотни строк одновременно?

Например: UPDATE table SET a = ? WHERE b = ? AND c = 1 UPDATE table SET a = ? WHERE b = ? AND c = 1

но для многих строк. ? параметрами являются массивы …

Я прочитал этот ответ, но он использует CASE, и я не думаю, что смогу это сделать …


Прямо сейчас у меня есть что-то вроде этого:

 foreach($values as $key => $value) $res = $pdo->prepare('UPDATE table SET a = ? WHERE b = ? AND c = 1'); $res->execute(array($value, $key)); } 

Чтобы сделать это за один проход запроса, вам нужно будет использовать CASE и соединить параметры программно . SQL не поддерживает переменные подготовленные операторы, и только простые значения могут быть параметризованы.

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

 try { $query = $db->prepare('UPDATE table SET a = ? WHERE b = ? AND c = 1'); foreach ($as as $i => $a) { $query->execute(array($a, $bs[$i])); } } catch (PDOException $e) { ... } 

Используйте метод CASE, как описано в приведенной вами ссылке, но динамически создавайте запрос со значениями, которые вы хотите.

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

Другой способ заключается в том, чтобы вставить пары ключевых значений (все сразу) во временную таблицу, а затем сделать что-то вроде этого:

 UPDATE table t SET ta = (SELECT pa FROM tmp p WHERE pb = tb) WHERE tb IN (SELECT pb FROM tmp p) AND tc = 1