Как я могу обновить сотни строк одновременно?
Например: 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