Solución:
Prueba esto
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)
Si id
es secuencial comenzando en 1, el más simple (y más rápido) sería:
UPDATE `table`
SET uid = ELT(id, 2952, 4925, 1592)
WHERE id IN (1,2,3)
Como ELT () devuelve el N-ésimo elemento de la lista de cadenas: cadena1 si N = 1, cadena2 si N = 2, y así sucesivamente. Devuelve NULL si N es menor que 1 o mayor que el número de argumentos.
Claramente, el código anterior solo funciona si id
es 1, 2 o 3. Si id
era 10, 20 o 30, cualquiera de los siguientes funcionaría:
UPDATE `table`
SET uid = CASE id
WHEN 10 THEN 2952
WHEN 20 THEN 4925
WHEN 30 THEN 1592 END CASE
WHERE id IN (10, 20, 30)
o el más simple:
UPDATE `table`
SET uid = ELT(FIELD(id, 10, 20, 30), 2952, 4925, 1592)
WHERE id IN (10, 20, 30)
Como FIELD () devuelve el índice (posición) de str en la lista str1, str2, str3, … Devuelve 0 si no se encuentra str.
Eso es porque te perdiste ELSE.
“Devuelve el resultado de la primera condición que es verdadera. Si no hubo ningún valor de 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)