我需要更新表的所有记录(不应超过100条记录)。每条记录都需要使用不同的值更新字段。
我是否必须对每个更新进行查询,还是有其他方式?我似乎无法立刻明白这一点
感谢您的帮助!
编辑:为了澄清,我正在更新的每个字段都将包含在客户端确定的唯一值。所以不涉及其他表格。
答案 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
查询中执行此操作。否则,没有。
一种方法是将经常更改的列存储在单独的表中,DELETE
或TRUNCATE
该表,并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数组,具体取决于您的需求,这将使其变得相当轻松。
如果是用户输入,请务必清理这些变量。