2012-10-05 49 views
52

Estoy tratando de actualizar una tabla GRANDE MyISAM (25 millones de registros) utilizando un script CLI. La tabla no está siendo bloqueada/utilizada por otra cosa.MySQL update CASE WHEN/THEN/ELSE

Me figuré que en lugar de hacer consultas de ACTUALIZACIÓN únicas para cada registro, también podría utilizar la función CASE.

El campo id es PRIMARIO. Sospecho que la siguiente consulta debería tomar milisegundos.

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    END 

De acuerdo, la consulta acapara la CPU y no termina para siempre.

Entonces, para mi sorpresa, descubrí que la consulta está actualizando todas las 25 millones de filas, colocando un NULL en las filas que no especifiqué.

¿Cuál es el propósito de eso? ¿Puedo hacer una actualización MASS en filas específicas sin actualizar 25 millones de filas cada vez que ejecuto esta consulta? ¿O tengo que hacer actualizaciones individuales y luego comprometerme?

+2

Cuando usted no especifique 'else' en' case' statement default es 'null' –

Respuesta

105

probar este

UPDATE `table` SET `uid` = CASE 
    WHEN id = 1 THEN 2952 
    WHEN id = 2 THEN 4925 
    WHEN id = 3 THEN 1592 
    ELSE `uid` 
    END 
WHERE id in (1,2,3) 
+1

se olvidó totalmente de WHERE ... ahora tiene sentido por qué sucede eso. Gracias lol. – nick

5

simple sería:

UPDATE `table` SET uid = ELT(id, 2952, 4925, 1592) WHERE id IN (1,2,3) 
4

Eso es porque se ha perdido más.

"Devuelve el resultado de la primera condición que es verdadera. Si no había ningún resultado coincidente, se devuelve el resultado después de ELSE o NULL si no hay una parte ELSE". (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

+0

incluso si especifiqué un ELSE .. ¿No trataría de actualizar el resto? Todavía no quiero actualizar 25 millones de registros cuando solo necesito actualizar 3. Poner una cláusula WHERE resuelve el problema. – nick

+0

Puedes probar ELSE BEGIN END – alex

Cuestiones relacionadas