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

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

问题描述:

我需要更新表中的所有记录(不应超过100条记录)。每条记录都需要用不同的值更新一个字段。MySQL:有没有办法在一个查询中更新整个表?

我需要为每个更新进行查询还是有其他方法?我似乎无法一次搞定

感谢您的帮助!

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

+1

可能需要一些关于这一个的更多信息。你是否增加了领域,比如从3变为4?所有行都获得相同的“新”值吗?你有一个包含新值和相应的主键(或其他字段)的数据集? – sberry 2010-01-04 23:57:54

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

如果你有新的价值观的短名单,您可以使用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; 
+0

感谢您的帮助!我试过你的更新情况查询,但我没有得到它的工作。我得到这个错误: #1064 - 你的SQL语法有错误;检查对应于您的MySQL服务器版本的手册,在第1行'CASE'附近使用正确的语法。 UPDATE Table1 SET column1 = CASE column2 WHEN 123 THEN 7 WHEN 456 56 ELSE 0 END CASE; – user239237 2010-01-05 13:38:18

+0

对不起,我忘记了MySQL语法结束时的表达式只是'END',而在其他RDBMS中他们更喜欢'END CASE'。我编辑了上面的例子。 – 2010-01-05 15:40:14

不知道你将分配给每一行的值,答案是“可能不是”。另一张海报提到,通过关闭WHERE子句,您可以同时影响所有行,但如果每行都需要自己的值,则不会对您有所帮助。

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

如果更新的值与要记录的记录不同,则每次都需要创建新的UPDATE语句。

+0

这不完全正确。如果您希望更新的数据存在于另一个表中,则可以使用一个更新语句。 – 2010-01-05 00:00:10

+0

哦没有想到 – antpaw 2010-01-05 00:03:30

如果每行的新值可以从行的当前值中推导出来,那么可以在单个UPDATE查询中完成。否则,不。

的一种方法是经常改变的列存储在一个单独的表,DELETETRUNCATE该表,并INSERT都在一个查询中的新的值(通过使用多行插入查询)。

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

如果每个值从其他值行中得到的,并且可以在一个简单的公式来计算,你可以做这样的事情:

UPDATE table_name SET col1 = (col2/col3); 

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

如果每个字段都需要不同的值,

您可以将值存储在数组中,并且可以编写一个循环来完成它,因此您无需手动编写每个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的阵列,根据您的需要,这将使它相当容易。

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