我可以使用一个查询更新多行吗?
如何结合以下查询:
UPDATE tablename SET col1='34355' WHERE id='2'
UPDATE tablename SET col1='152242' WHERE id='44'
答案 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子句中使用表达式做一些时髦的东西,但一般来说做多个查询都比较干净,除非有一个非常具体的原因你不能。