2011-02-15 45 views
5

¿Puedo actualizar varias filas con una consulta?Actualizar varias filas con una consulta

Cómo hacerlo unión consultas siguientes:

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

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

¿Por qué quieres hacer esto? – CanSpice

Respuesta

1

Puede utilizar una cláusula OR combinado con la función IF() (o CASE WHEN... para otros RDBMS)

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

Para un largo conjunto de actualizaciones, sería más fácil simplemente hacer consultas de actualización individuales, en lugar de construir esta espantosa monstruosidad. La única ventaja de esta versión es que podría simular una transacción en bases de datos que no tienen en cuenta las transacciones. –

+0

@ marc-b El OP preguntó con respecto a 2 filas. Otro inconveniente si la lista es grande, el analizador puede elegir un escaneo de tabla en lugar de una fusión de índice. –

+1

Recomiende altamente las consultas individuales. La respuesta es correcta, aunque sugiero no usarla. – Kriem

0

En general, la única manera que puede actualizar múltiples filas en una sola consulta es si su cláusula where coincide con varias filas ... y luego cada fila tendrá los mismos valores establecidos.

Más allá de que puedes hacer cosas divertidas con expresiones en las cláusulas establecidas, pero en general es más sencillo hacer varias consultas, a menos que haya una razón muy específica que no puedes.

2

¿Usted? Por supuesto. ¿Deberías? De ninguna manera.

Piensa en la persona que mira tu código en cinco años. Lo que es más fácil de leer, esto:

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

o esto (La respuesta del Scrum Meister):

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

La segunda es más corto, pero es un reto de averiguar exactamente lo que está haciendo. Si usted está preocupado por las condiciones de carrera, lo convierten en una sola transacción (en la mayoría de DBMS moderna):

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

De esta manera se puede garantizar ninguna otra consulta se ejecutará cuando la fila 2 se actualiza la fila 44, pero no lo es.

4

Puede usar una tabla de mapa virtual para esta actualización.

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 

El uso de este patrón permite una fácil expansión (simplemente agregue filas al mapa). También permite que MySQL elija de manera más predecible un índice en tablename.id para la operación JOIN normal.

+0

Wow. Eso es magia. – Almo

Cuestiones relacionadas