2014-09-18 1 views
1

это то, что моя таблица выглядитзначения в MySQL сброса обратно в 0 после запроса обновления

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 1300 | 1300 |  0 | 2000 | 1300 |  0 | 
|______|________|________|________|________|________|________| 
| 10 |  0 |  0 |  0 | 2000 |  0 |  0 | 
|______|________|________|________|________|________|________| 

Теперь я обновляю

UPDATE points set val5 = CASE WHEN id = 10 THEN val5 + 500 WHEN id = 1 THEN val5 + 500 END WHERE id IN ('10','1') 

Это то, что моя таблица выглядит

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 1800 | 1800 |  0 | 2000 | 1800 |  0 | 
|______|________|________|________|________|________|________| 
| 10 | 500 | 500 |  0 | 2000 | 500 |  0 | 
|______|________|________|________|________|________|________| 
| 157 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 

Теперь я снова обновляю (там, где он сломан)

UPDATE points set val5 = CASE WHEN id = 1 THEN val5 + 500 END, val6 = CASE WHEN id = 10 THEN val6 + 500 END WHERE id IN ('10','1') 

Моя таблица выглядит следующим образом

_____________________________________________________________ 
| id | val1 | val2 | val3 | val4 | val5 | val6 | 
|______|________|________|________|________|________|________| 
| 1 | 2300 | 2300 |  0 | 2000 | 2300 |  0 | 
|______|________|________|________|________|________|________| 
| 10 | 1000 |  0 | 500 | 2000 |  0 | 500 | 
|______|________|________|________|________|________|________| 
| 157 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 
| 158 |  0 |  0 |  0 | 800 |  0 |  0 | 
|______|________|________|________|________|________|________| 

Вы заметили, как val2 и val5 вернулся к нулю, даже если я не сказать ему? что мне не хватает?

+0

Является ли 'id' строкой или номером? – Linger

+0

Прошу прощения, но я не вижу, как ваши обновления будут добавлять строки, как показывает ваш пример. –

+0

эта часть является еще одним запросом перед запросом, который я показываю –

ответ

2

Если выражение не соответствует ни одному из предложений when в case, оно возвращает null, что не является поведением, которое вы, похоже, хотите. Вместо этого, вы должны возвращать сам столбец в else статьи:

UPDATE points 
SET val5 = CASE WHEN id = 1 THEN val5 + 500 ELSE val5 END, -- Notice the else 
     val6 = CASE WHEN id = 10 THEN val6 + 500 ELSE val6 END -- Here too 
WHERE id IN (10, 1) 
+0

** @ Mureinik **, в вашем заявлении CASE у вас есть 'id' как число. В вашем заявлении WHERE у вас есть это как varchar. Что он? – Linger

+0

@Linger копируется с OP - спасибо, исправлено. – Mureinik

+0

Большое вам спасибо, я не могу поверить, что я пропустил это –

1

Для первого запроса вам даже не нужен саз. Следующие должны работать:

UPDATE points 
SET val5 = val5 + 500 
WHERE id IN (10, 1) 

Для второго запроса вы должны будете иметь заявление ELSE:

UPDATE points 
SET val5 = CASE WHEN id = 1 THEN val5 + 500 ELSE val5 END, 
    val6 = CASE WHEN id = 10 THEN val6 + 500 ELSE val6 END 
WHERE id IN (10, 1) 

Я заметил одну вещь. Вы используете id = 1 и id = 10 в своем заявлении CASE. Но тогда вы используете id IN ('10','1') в своем заявлении WHERE. Итак, id строка или номер. В моих примерах я изменил его на число.