Обновление MySQL, если значение больше текущего значения

Я собираюсь пойти и опубликовать свой страшный код MySQL:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(302 > uptime, 302, uptime), if(0 > players, 0, players), if(1 > rank, 1, rank)

Хорошо, позвольте мне объяснить, что мне нужно делать.

  • "id" имеет уникальный индекс. Если этот индекс еще не существует, я хочу вставить эти значения.
  • Если есть повторяющийся ключ, я хочу вместо этого ОБНОВИТЬ каждое из трех полей, только если новые значения больше, чем те, которые в настоящее время находятся в таблице.

Похоже, я делаю что-то ужасно неправильно, и я совершенно откровенно не знаю, что делать. Я пытался сделать это хорошо, но оказалось, что это ужасный беспорядок.

Я надеюсь, что кто-то может привести меня в правильном направлении и помочь мне научиться (и всем, кто пытается учиться), как это делать. Спасибо.

Ответ 1

Ваш запрос кажется прекрасным, но вы можете улучшить его для ясности:

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
  VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE 
  uptime = GREATEST(uptime, VALUES(uptime)), 
  players = GREATEST(players, VALUES(players)),
  rank = GREATEST(rank, VALUES(rank))

Ответ 2

Вы можете избежать дублирования, используя VALUES. И другие вещи просто хороши в вашем запросе

INSERT INTO monthlystats (id, server, time, uptime, players, rank) 
VALUES (09126, 6, 0912, 302, 0, 1) 
ON DUPLICATE KEY UPDATE uptime = if(VALUES(uptime) > uptime, VALUES(uptime), uptime)