У меня есть SQL-запрос следующей формы:
UPDATE foo
SET flag=true
WHERE id=?
У меня также есть массив PHP со списком идентификаторов. Как лучше всего добиться этого, кроме синтаксического анализа, как показано ниже, ...
foreach($list as $item){
$querycondition = $querycondition . " OR " . $item;
}
... и используя вывод в предложении WHERE?






Вы должны иметь возможность использовать предложение IN (при условии, что ваша база данных поддерживает его):
UPDATE foo
SET flag=true
WHERE id in (1, 2, 3, 5, 6)
Я никогда не видел другого способа сделать это, кроме вашего цикла foreach.
Но если $ list каким-либо образом получен от пользователя, вам следует придерживаться использования подготовленного оператора и просто обновлять строку за раз (при условии, что у кого-то нет возможности обновить несколько строк с помощью подготовленного оператора). В противном случае вы широко открыты для внедрения sql.
Используйте join / implode, чтобы составить список с разделителями-запятыми, чтобы в итоге получилось:
UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
Это приведет к тому же результату, но, вероятно, не приведет к значительному увеличению скорости, но выглядит лучше.
mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
вы можете заблокировать обновление с помощью операторов case, но вам придется создавать запрос самостоятельно.
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: dim delimitedIdList как строка = arrayToString (listOfIds)
dim SQL as string = "UPDATE foo SET flag = true WHERE id in (" + delimitedIdList + ")"
runSql (SQL)
Используйте оператор 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 .....)
Если вы знаете ограничение на количество элементов, используйте предложение IN, как предлагали другие:
UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)
Однако одно предупреждение заключается в том, что в зависимости от вашей базы данных может быть ограничение на количество элементов в предложении. Например, oracle 7 или 8 (?) Раньше имел ограничение в 256 элементов (в более поздних версиях это было значительно увеличено)
Если вы выполняете итерацию по списку, используйте транзакцию, чтобы вы могли откатиться, если одно из обновлений не удастся.