如何一次更新数百行?
像:
UPDATE table SET a = ? WHERE b = ? AND c = 1
但是对于许多行。 ?
参数是数组...
我读了this answer但它使用了CASE而我认为我不能这样做......
现在我有这样的事情:
foreach($values as $key => $value)
$res = $pdo->prepare('UPDATE table SET a = ? WHERE b = ? AND c = 1');
$res->execute(array($value, $key));
}
答案 0 :(得分:7)
要在一次查询中执行此操作,您需要使用CASE
和assemble the parameters programmatically。 SQL不支持可变参数预处理语句,只能参数化simple values。
或者,定义一个语句,一次只获取一行数据,然后循环运行查询。重复执行是指如何将预备语句设计用于此类情况。
try {
$query = $db->prepare('UPDATE table SET a = ? WHERE b = ? AND c = 1');
foreach ($as as $i => $a) {
$query->execute(array($a, $bs[$i]));
}
} catch (PDOException $e) {
...
}
答案 1 :(得分:4)
使用您提供的链接中描述的CASE方法,但使用您想要的值动态构建查询。
可能,这将使用类似于您已经执行的for循环构建,但是您将最终使用单个查询而不是每次迭代查询数据库。
答案 2 :(得分:2)
另一种方法是将您的键值对(全部一次)插入临时表中,然后执行以下操作:
UPDATE table t
SET t.a = (SELECT p.a FROM tmp p WHERE p.b = t.b)
WHERE t.b IN (SELECT p.b FROM tmp p) AND t.c = 1