Как мне сделать несколько обновлений в одном запросе SQL? - PullRequest
7 голосов
/ 02 сентября 2008

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

UPDATE foo
SET flag=true
WHERE id=?

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

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

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

Ответы [ 8 ]

9 голосов
/ 02 сентября 2008

Это позволило бы добиться того же, но, вероятно, не принесет значительного увеличения скорости, но выглядит лучше.

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
5 голосов
/ 02 сентября 2008

Используйте оператор 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 .....)
5 голосов
/ 02 сентября 2008

Вы должны быть в состоянии использовать предложение IN (при условии, что ваша база данных поддерживает его):

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

1 голос
/ 02 сентября 2008

Используйте join / implode, чтобы создать список с разделителями-запятыми, чтобы в итоге получить:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
0 голосов
/ 02 сентября 2008

Если вам известно ограничение на количество элементов, используйте предложение «IN», как предлагали другие:

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

Одно предупреждение, однако, состоит в том, что в зависимости от вашей базы данных может быть ограничение на количество элементов в предложении. Например, оракул 7 или 8 (?) Имел ограничение в 256 пунктов (это было значительно увеличено в более поздних версиях)
Если вы выполняете итерацию по списку, используйте транзакцию, чтобы можно было выполнить откат в случае сбоя одного из обновлений

0 голосов
/ 02 сентября 2008

Код VB.NET: dim delimitedIdList as string = arrayToString (listOfIds)

dim SQL as string = "UPDATE foo SET flag = true ГДЕ идентификатор в (" + delimitedIdList + ")"

runSql (SQL)

0 голосов
/ 02 сентября 2008

вы можете замять обновление с помощью инструкций 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)  

Где можно опустить, но избавит вас от полного обновления таблицы.

0 голосов
/ 02 сентября 2008

Я никогда не видел способа сделать это, кроме вашего цикла foreach.

Но, если $ list каким-либо образом получен от пользователя, вам следует придерживаться использования подготовленного оператора и просто обновлять строку за раз (при условии, что у кого-то нет способа обновить несколько строк с помощью подготовленного оператора) ). В противном случае вы широко открыты для инъекций sql.

...