2012-10-05 22 views
52

Sto tentando di aggiornare una tabella MyISAM LARGE (25 milioni di record) utilizzando uno script CLI. Il tavolo non viene bloccato/utilizzato da nient'altro.Aggiornamento MySQL CASE WHEN/THEN/ELSE

Ho pensato invece di eseguire singole query UPDATE per ogni record, potrei anche utilizzare la funzione CASE.

Il campo id è PRIMARIO. Sospetto che la seguente query debba richiedere millisecondi.

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

Ecco, la query occupa la CPU e non termina per sempre.

Quindi, con mia sorpresa, ho scoperto che la query sta aggiornando tutte le 25 milioni di righe, posizionando un NULL su righe che non ho specificato.

Qual è lo scopo? Posso eseguire un aggiornamento MASS su righe specifiche senza aggiornare 25 milioni di righe ogni volta che eseguo questa query? O devo fare singoli aggiornamenti e poi commettere?

+2

Quando non specificare 'else' in' case' istruzione default è 'null' –

risposta

105

Prova questa

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

totalmente dimenticato DOVE .. ora ha senso perché ciò accade. Grazie lol. – nick

5

Più semplice sarebbe:

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

Questo perché vi siete persi ELSE.

"Restituisce il risultato per la prima condizione che è vera. Se non c'era alcun valore di risultato corrispondente, il risultato dopo ELSE viene restituito, o NULL se non c'è nessuna parte ELSE." (http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case)

+0

anche se ho specificato un ELSE .. Non proverebbe ad aggiornare il resto? Non desidero ancora aggiornare 25 milioni di record quando devo solo aggiornare 3. L'inserimento di una clausola WHERE risolve il problema. – nick

+0

Puoi provare ELSE BEGIN END – alex