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

StackOverflow https://stackoverflow.com/questions/39792

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top