MySQL:有没有办法在一个查询中更新整个表?

时间:2010-01-04 23:53:03

标签: mysql

我需要更新表的所有记录(不应超过100条记录)。每条记录都需要使用不同的值更新字段。

我是否必须对每个更新进行查询,还是有其他方式?我似乎无法立刻明白这一点

感谢您的帮助!

编辑:为了澄清,我正在更新的每个字段都将包含在客户端确定的唯一值。所以不涉及其他表格。

6 个答案:

答案 0 :(得分:7)

答案很大程度上取决于新值的来源。

如果您有新值的简短列表,则可以使用CASE

UPDATE Table1
SET column1 = CASE column1
              WHEN 123 THEN ?
              WHEN 456 THEN ?
              ELSE ?
              END;

如果新值列表很长,这是不切实际的。

如果需要使用另一个表的相关行中存在的值更新行,则可以使用MySQL的多表UPDATE语法:

UPDATE Table1 JOIN Table2 ON (Table1.pk = Table2.fk)
SET Table1.column1 = Table2.column2;

您也可以使用相关子查询执行类似操作。

UPDATE Table1 SET column1 = (SELECT column2 FROM Table2 WHERE Table2.fk = Table1.pk);

很久以前,当我使用MySQL 3.23(在它支持多表更新或子查询之前)之前,我会运行一个SELECT,其输出是完全形成的UPDATE语句。获取所有引号是很棘手的,但结果是一个包含数百个单独UPDATE语句的SQL脚本,每个语句都在一行中更改值。效率不高,但如果只是不经常进行,那就很好了。

SELECT CONCAT(
  'UPDATE Table1 SET column1 = ', QUOTE(Table2.column2), 
  ' WHERE pk = ', Table2.fk, ';') AS SQL_statement
FROM Table2;

答案 1 :(得分:0)

在不知道您将为每一行分配的值的情况下,答案是“可能没有”。另一张海报提到你可以通过不使用WHERE子句来一次影响所有行,但是如果每行都需要它自己的值,这对你没有帮助。

如果您可以提供一些有关如何知道每行的价值的信息,可能会有更好的答案。等待更多信息...

答案 2 :(得分:0)

如果更新的值因记录而异,则每次都需要创建一个新的UPDATE语句。

答案 3 :(得分:0)

如果可以从行的当前值推导出每行的新值,则可以在单个UPDATE查询中执行此操作。否则,没有。

一种方法是将经常更改的列存储在单独的表中,DELETETRUNCATE该表,并INSERT在一个查询中使用所有新值(通过使用多个-row insert query)。

在MySQL中,您可以访问ON DUPLICATE KEY UPDATE来改进第一种方法。

答案 4 :(得分:0)

如果每个值都是从行中的其他值派生的,并且可以用简单的表达式计算,那么你可以这样做:

UPDATE table_name SET col1 = (col2 / col3);

但是如果您的新值是在数据库之外计算的(例如,通过脚本),那么您可能无法为每行的单独更新查询做得更好。

答案 5 :(得分:0)

如果每个字段需要不同的值,则为。

您可以在数组中包含值,并且可以编写一个执行它的循环,因此您不需要手动编写每个UPDATE。

$myIds = array('1', '2', '3');
$myField = array('something', 'something2', 'something3');

for($i=0; $i<count($myIds); $i++){
   mysql_query("UPDATE table SET field = '{$myField[$i]}' WHERE id = '{$myIds[$i]}');
}

您甚至可以通过SELECT语句创建$ myIds和$ myField数组,具体取决于您的需求,这将使其变得相当轻松。

如果是用户输入,请务必清理这些变量。