Как мне выполнить несколько обновлений в одном SQL-запросе?

У меня есть SQL-запрос следующей формы:

UPDATE foo
SET flag=true
WHERE id=?

У меня также есть массив PHP со списком идентификаторов. Как лучше всего добиться этого, кроме синтаксического анализа, как показано ниже, ...

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

... и используя вывод в предложении WHERE?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
3 232
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Вы должны иметь возможность использовать предложение 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 элементов (в более поздних версиях это было значительно увеличено)
Если вы выполняете итерацию по списку, используйте транзакцию, чтобы вы могли откатиться, если одно из обновлений не удастся.

Другие вопросы по теме