MySQL:有没有办法在一个查询中更新整个表?
我需要更新表中的所有记录(不应超过100条记录)。每条记录都需要用不同的值更新一个字段。MySQL:有没有办法在一个查询中更新整个表?
我需要为每个更新进行查询还是有其他方法?我似乎无法一次搞定
感谢您的帮助!
编辑:为了澄清,我正在更新的每个字段都将包含一个在客户端确定的唯一值。所以没有其他表参与。
答案很大程度上取决于新值的来源。
如果你有新的价值观的短名单,您可以使用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;
感谢您的帮助!我试过你的更新情况查询,但我没有得到它的工作。我得到这个错误: #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
对不起,我忘记了MySQL语法结束时的表达式只是'END',而在其他RDBMS中他们更喜欢'END CASE'。我编辑了上面的例子。 – 2010-01-05 15:40:14
不知道你将分配给每一行的值,答案是“可能不是”。另一张海报提到,通过关闭WHERE子句,您可以同时影响所有行,但如果每行都需要自己的值,则不会对您有所帮助。
如果您可以提供一些关于如何知道给每行赋予什么值的信息,可能会有更好的答案。等待更多信息...
如果更新的值与要记录的记录不同,则每次都需要创建新的UPDATE语句。
这不完全正确。如果您希望更新的数据存在于另一个表中,则可以使用一个更新语句。 – 2010-01-05 00:00:10
哦没有想到 – antpaw 2010-01-05 00:03:30
如果每行的新值可以从行的当前值中推导出来,那么可以在单个UPDATE
查询中完成。否则,不。
的一种方法是经常改变的列存储在一个单独的表,DELETE
或TRUNCATE
该表,并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的阵列,根据您的需要,这将使它相当容易。
如果是用户输入,请务必清理这些变量。
可能需要一些关于这一个的更多信息。你是否增加了领域,比如从3变为4?所有行都获得相同的“新”值吗?你有一个包含新值和相应的主键(或其他字段)的数据集? – sberry 2010-01-04 23:57:54