使用一个查询更新多行

时间:2011-02-15 18:54:59

标签: sql mysql union

我可以使用一个查询更新多行吗?

如何结合以下查询:

UPDATE tablename SET col1='34355' WHERE id='2'

UPDATE tablename SET col1='152242' WHERE id='44'

4 个答案:

答案 0 :(得分:4)

您可以使用虚拟地图表进行此次更新。

update tablename
inner join (
    select '34355'  col1, '2'  id union all
    select '152242' col1, '44' id
) map on map.id = tablename.id
set tablename.col1 = map.col1

使用此模式可以轻松扩展(只需向地图添加行)。它还允许MySQL更可预测地在tablename.id上选择索引以进行正常的JOIN操作。

答案 1 :(得分:2)

你能吗?当然。你应该?没办法。

考虑一下五年内查看代码的人。什么更具可读性:

UPDATE tablename SET col1='34355' WHERE id='2';
UPDATE tablename SET col1='152242' WHERE id='44';

或者这个(Scrum Meister的答案):

UPDATE tablename SET col1 = IF(id='2', '34355','152242') WHERE id='2' OR id='44';

第二个更短,但要确切地弄清楚它在做什么是一个挑战。如果您担心竞争条件,请将其作为单个事务(在大多数现代DBMS中):

BEGIN;
UPDATE tablename SET col1='34355' WHERE id='2';
UPDATE tablename SET col1='152242' WHERE id='44';
COMMIT;

这样可以保证在更新第2行但第44行不会运行时,不会运行其他查询。

答案 2 :(得分:1)

您可以将OR子句与IF()函数结合使用(或CASE WHEN...用于其他RDBMS)

UPDATE tablename SET col1 = IF(id='2', '34355','152242')
WHERE id='2' OR id='44'

答案 3 :(得分:0)

通常,在单个查询中更新多行的唯一方法是,如果where子句匹配多行...然后每行将设置相同的值。

过去你可以在你的set子句中使用表达式做一些时髦的东西,但一般来说做多个查询都比较干净,除非有一个非常具体的原因你不能。