MySQL:使用一个查询进行多行更新

时间:2011-10-04 16:58:26

标签: php mysql

我有一个像这样有3000多行的阵列

$COUNTS = array(
1=>5,
2=>22,
3=>120,
4=>0,
....
);

其中键表示ID,值是计算的COUNT ...

我需要使用这些新值(使用php)更新表中的所有行...

所以现在我一个接一个地更新它们 (简化)喜欢

foreach($COUNTS as $id=>$count){
mysql_query("UPDATE categories SET count=$count WHERE id=$id");
}

我需要制作3,000多个查询,才能进行简单的更新....

这可以通过一个查询或任何其他资源消耗较少的方式完成吗?可能生成一个csv文件并在运行中进行更新或其他什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试类似

的内容
UPDATE categories c
INNER JOIN 
(
   SELECT 1 as id, 23 as `cnt`
   UNION
   SELECT 2 as id, 25 as `cnt`
   -- UNION  etc
)a
ON  c.id = a.id
SET c.`count` = a.cnt

答案 1 :(得分:1)

看起来你可能已经想到了这一点,但无论如何都有一些建议。如果您正在进行大量更新(特别是一次或很少),请确保禁用任何触发器(如果不需要)以及索引。但是,在您的情况下,索引似乎不是问题。

您当然可以将查询保留在循环中。 3000条记录的9s似乎很高,但取决于其他情况,这可能没问题。

您还可以将数据写入文件,然后通过

将文件批量插入新表中
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;

请参阅http://dev.mysql.com/doc/refman/5.5/en/load-data.html以供参考。然后,您必须加入这两个表以进行更新。在这种情况下你必须处理文件IO和另一个数据库连接,所以不确定你会节省多少钱。

另一种选择是创建一个预准备语句并将参数绑定到它。那也应该更快一点。查看http://us2.php.net/manual/en/mysqli.prepare.php了解详情

相关问题