2016-12-09 11 views
0

В следующем запросе я хочу обновить столбец ConcurrentJobs, только если значение в столбце MaxConcurrentJobs равно greater than or equal to, значение ConcurrentJobs обновляется.Случайное выражение не работает, как ожидалось, с предложением «on duplicate key update»

insert into userjobinfo (UserId,ConcurrentJobs) values (335,2300) 
      on duplicate key update ConcurrentJobs = case when values(MaxConcurrentJobs) >= ConcurrentJobs 
            then ConcurrentJobs else values(ConcurrentJobs) end; 

Но вышеуказанный запрос не работает должным образом. Он всегда обновляет значение 2300 в столбце concurrent jobs, даже если условие терпит неудачу. Что может быть причиной этого? Где выполняется запрос?

+1

Это выражение случая, а не заявление о случае. – jarlh

+1

@jarlh Отредактировано .. –

ответ

0

..VALUES (col_name) в KEY UPDATE пункта ВКЛ DUPLICATE относится к значению имя_столбца, который будет вставлен, если бы не произошел дубликат ключа конфликта. Значения() функция имеет смысл только в INSERT ... UPDATE заявление и возвращает NULL в противном случае http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

Поскольку values(MaxConcurrentJobs) относится к колонку вы НЕ вставив его в NULL, так ваше состояние по умолчанию всегда values(ConcurrentJobs) .use триггер для этой логики.

0

Вам не нужно указывать колонки уже в строке, используя VALUES(); то есть для новых значений в поставке INSERT. Я думаю, что следующее должно работать:

insert into userjobinfo (UserId,ConcurrentJobs) 
    values (335, 2300) 
    on duplicate key update 
     ConcurrentJobs = (case when MaxConcurrentJobs >= VALUES(ConcurrentJobs) 
           then VALUES(ConcurrentJobs) 
           else ConcurrentJobs 
          end);