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

时间:2020-03-05 18:46:32  来源:igfitidea点击:

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

UPDATE foo
SET flag=true
WHERE id=?

我也有一个包含ID列表的PHP数组。除了解析,最好的方法是什么,如下所示,...

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

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

解决方案

回答

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

`更新foo
SET标志=真
在(1,2,3,5,6)中的ID

回答

除了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)

可以省略where,但是可以避免全表更新。

回答

VB.NET代码:
昏暗的delimitedIdList作为字符串= arrayToString(listOfIds)

昏暗的SQL作为字符串=" 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个项目的限制(在更高版本中此功能显着增加)
如果我们要遍历列表,请使用事务,以便在其中一项更新失败时回滚