2013-02-15 28 views
45

È possibile eseguire una query UPDATE in MySQL che aggiorna il valore del campo solo se viene soddisfatta una determinata condizione? Qualcosa di simile a questo:MySQL: aggiorna un campo solo se la condizione è soddisfatta

UPDATE test 
SET 
    CASE 
     WHEN true 
     THEN field = 1 
    END 
WHERE id = 123 

In altre parole:

UPDATE test 
SET 
    something = 1,  /*field that always gets updated*/ 
    CASE 
     WHEN true 
     THEN field = 1 /*field that should only get updated when condition is met*/ 
    END 
WHERE id = 123 

Qual è il modo corretto di fare questo?

+1

L'unica ragione per usare caso nella query di aggiornamento è che se si desidera aggiornare le righe in modo diverso a seconda una condizione. Se vuoi semplicemente aggiornare alcune righe, aggiungi le condizioni alla clausola where. – SilverSnake

risposta

87

Sì!

Ecco un altro esempio:

UPDATE prices 
SET final_price= CASE 
    WHEN currency=1 THEN 0.81*final_price 
    ELSE final_price 
END 

Questo funziona perché MySQL non aggiorna la fila, se non v'è nessun cambiamento, as mentioned in docs:

Se si imposta una colonna per il valore Al momento, MySQL nota questo e non lo aggiorna.

+4

"campo" verrebbe aggiornato solo se la condizione è soddisfatta, ** altrimenti non viene fatto nulla. ** –

+0

Sì! Esattamente quello che voglio che faccia. – fedorqui

+2

E che dire 'DOVE valuta = 1'? –

14

Prova questa:

UPDATE test 
SET 
    field = 1 
WHERE id = 123 and condition 
+2

no no, lol ... quello che voglio dire è che mi sono imbattuto nel post e ho visto qualcuno svalutarti senza motivo, quindi ho pensato che avrei inversamente votato per "minimizzare l'effetto" sui tuoi punteggi :) I non è stato colui che lo ha svalutato. – Sarel

+1

Ho downvoted di nuovo ... perché non è nemmeno lontanamente una soluzione al problema ... mi lascia perplesso il modo in cui la gente sembra aver svalutato questo – Dominique

+0

@Dominique, Forse hai confuso per errore sulla parola 'condition'? –

13

Un'altra soluzione che, a mio parere, è più facile da leggere sarebbe:

UPDATE test SET something = 1, field = IF(condition is true, 1, field) WHERE id = 123 

Quello che fa è impostato 'campo' a 1 (come OP usato come esempio) se la condizione è soddisfatta e utilizzare il valore corrente di 'campo' se non soddisfatti. Usare il valore precedente è lo stesso di non cambiare, quindi eccoti.

0

Un'altra variazione:

UPDATE test 
SET field = IF ({condition}, {new value}, field) 
WHERE id = 123 

Questo aggiornerà il field con {new value} solo se {condition} è soddisfatta

Problemi correlati