2013-02-15 28 views
45

Czy można wykonać zapytanie UPDATE w MySQL, które aktualizuje wartość pola tylko wtedy, gdy spełniony jest określony warunek? Coś takiego:MySQL: zaktualizuj pole tylko wtedy, gdy spełniony jest warunek.

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

Innymi słowy:

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 

Co to jest właściwy sposób to zrobić?

+1

jedynym powodem przypadek użycia w zapytaniu Update jest jeśli chcesz zaktualizować wiersze w różny sposób w zależności od stan. Jeśli chcesz tylko zaktualizować niektóre wiersze, po prostu dodaj warunki do klauzuli where. – SilverSnake

Odpowiedz

87

Tak!

Tutaj masz inny przykład:

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

To działa, ponieważ MySQL nie aktualizuje wiersz, jeśli nie ma zmian, as mentioned in docs:

Jeśli ustawisz kolumnę z wartością obecnie ma, MySQL zauważa to i nie aktualizuje go.

+4

"Pole" zostanie zaktualizowane tylko wtedy, gdy warunek zostanie spełniony, ** w przeciwnym razie nic nie zostanie zrobione. ** –

+0

Tak! Dokładnie to, co chcę zrobić. – fedorqui

+2

Co na temat ,, GDZIE waluta = 1 "? –

14

Spróbuj tego:

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

Nie, nie, lol ... mam na myśli to, że natknąłem się na post i zobaczyłem, że ktoś cię zawiódł bez powodu, więc pomyślałem, że zrobię to, żeby przynajmniej pomóc "zminimalizować efekt" na twoich wynikach :) I to nie ten, który go zarzucił. – Sarel

+1

Powtórzyłem to jeszcze raz ... ponieważ nie jest to nawet rozwiązanie problemu ... zastanawia mnie to, jak ludzie wydają się przegłosowywać to – Dominique

+0

@Dominique, Może zdezorientował cię błąd na słowie 'condition'? –

13

Innym rozwiązaniem, które, moim zdaniem, jest łatwiejszy do czytania będzie:

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

Co to jest ustawione „pole” 1 (jak OP wykorzystywana jako przykład), jeśli warunek jest spełniony i użyj bieżącej wartości "pola", jeśli nie jest spełniony. Używanie poprzedniej wartości jest takie samo, jak to się nie zmienia, więc gotowe.

0

Inny wariant:

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

ten zaktualizuje field z {new value} tylko jeśli {condition} jest spełniony

Powiązane problemy