如何在单个SQL查询中执行多个更新?

时间:2008-09-02 15:22:57

标签: php sql where

我有一个SQL查询,它采用以下形式:

UPDATE foo
SET flag=true
WHERE id=?

我还有一个PHP数组,其中包含一个ID列表。除了解析之外,实现此目的的最佳方法是什么,如下所示......

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

...并使用WHERE子句中的输出?

8 个答案:

答案 0 :(得分:9)

这可以实现同样的目的,但可能不会产生很大的速度提升,但看起来更好。

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");

答案 1 :(得分:5)

您应该能够使用IN子句(假设您的数据库支持它):

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

答案 2 :(得分:5)

使用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 .....)

答案 3 :(得分:1)

使用join / implode制作以逗号分隔的列表,最后得到:

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)

答案 4 :(得分:0)

除了你的foreach循环,我还没有看到过这样做的方法。

但是,如果$ list以任何方式从用户获得,您应该坚持使用预准备语句并且一次只更新一行(假设某人没有办法用准备好的语句更新多行)。否则,您对sql注入非常开放。

答案 5 :(得分:0)

你可以用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)  

可以省略的地方,但可以避免全表更新。

答案 6 :(得分:0)

VB.NET代码: dim delimitedIdList as string = arrayToString(listOfIds)

dim SQL as string =“UPDATE foo SET flag = true WHERE id in(”+ delimitedIdList +“)”

runSql(SQL)

答案 7 :(得分:0)

如果您知道项目数量的限制,那么请使用“IN”子句,正如其他人所建议的那样:

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

但是,一个警告是,根据您的数据库,子句中的元素数量可能会有限制。例如oracle 7或8(?)曾经有256个项目的限制(这在以后的版本中显着增加)
如果您对列表进行迭代,请使用事务,以便在其中一个更新失败时回滚