Как мне выполнить несколько обновлений в одном SQL-запросе?
Вопрос
У меня есть SQL-запрос, который принимает следующую форму:
UPDATE foo
SET flag=true
WHERE id=?
У меня также есть PHP-массив, который содержит список идентификаторов.Каков наилучший способ добиться этого, кроме как с помощью синтаксического анализа, следующим образом, ...
foreach($list as $item){
$querycondition = $querycondition . " OR " . $item;
}
...и используя выходные данные в WHERE
оговорка?
Решение
Это позволило бы добиться того же, но, вероятно, не приведет к значительному увеличению скорости, но выглядит лучше.
mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
Другие советы
Вы должны иметь возможность использовать предложение IN (при условии, что ваша база данных поддерживает его):
ОБНОВЛЕНИЕ foo
SET flag = true
ГДЕ идентификатор в (1, 2, 3, 5, 6)
Используйте оператор IN. Предоставить список значений ключей через запятую. Вы можете легко сделать это, используя функцию implode
.
UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)
В качестве альтернативы вы можете использовать условие:
UPDATE foo SET flag = true WHERE flag = false
или подзапрос:
UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)
Используйте join / implode, чтобы создать список с разделителями-запятыми, чтобы в итоге получилось:
UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
Я никогда не видел другого способа, кроме вашего цикла foreach.
Но, если $ list каким-либо образом получен от пользователя, вы должны придерживаться подготовленного оператора и просто обновлять строку за раз (при условии, что у кого-то нет способа обновить несколько строк с помощью подготовленного оператора). ). В противном случае вы широко открыты для внедрения SQL.
вы можете заполнить обновление с помощью инструкций, но вам придется создать запрос самостоятельно.
UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END
,flag=CASE ID WHEN 6 THEN false ELSE flag END
WHERE id in (5,6)
Где можно опустить, но избавит вас от полного обновления таблицы.
VB.NET код: затемнить delimitedIdList в виде строки = arrayToString(listOfIds)
dim SQL как строка = " ОБНОВИТЬ foo SET flag=true, ГДЕ id в (" + delimitedIdList + ")"
Запускает SQL (SQL)
Если вы знаете ограничение на количество элементов, используйте " IN " пункт, как другие предложили:
UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)
Однако, одно предупреждение: в зависимости от вашей базы данных может быть ограничение на количество элементов в предложении. Например, оракул 7 или 8 (?) Имел ограничение в 256 элементов (это было значительно увеличено в более поздних версиях)
Если вы выполняете итерацию по списку, используйте транзакцию, чтобы можно было выполнить откат в случае сбоя одного из обновлений