UPDATE столбец, если столбец больше значения - PullRequest
1 голос
/ 28 апреля 2020

У меня есть таблица с этими столбцами

  • proxy_id (первичный ключ)
  • proxy (IP прокси)
  • current_requests (количество текущих запросов, обработанных прокси с момента его last_cool_down)
  • total_requests (количество запросов, выполненных этим прокси за время его жизни)
  • last_used (дата и время в последний раз этот прокси был использован)
  • last_cool_down (дата и время последнего перезапуска этого прокси)

После использования прокси я запускаю эту команду (очевидно, с текущей датой и время, но мы будем считать, что текущая дата и время 2020-04-28 13:10:03)

UPDATE proxy_table
SET
current_requests = current_requests + 1,
total_requests = total_requests + 1,
last_used = '2020-04-28 13:10:03',
last_cool_down = '2020-04-28 13:10:03'
WHERE proxy_id = 1

Моя проблема в том, что я ВСЕГДА должен обновлять current_requests и last_used независимо от того, что. Однако в приведенном выше коде это условие не учитывается. Если current_requests + 1 == 20, то current_requests = 0 и last_cool_down = '2020-04-28 13:10:03'. Как я могу это сделать?

Так что, по сути, что-то вроде этого

UPDATE proxy_table

if (current_requests + 1 == 20) {
    SET current_requests = 0;
    SET last_cool_down = '2020-04-28 13:10:03';
else {
    SET current_requests = current_requests + 1;
}

SET total_requests = total_requests + 1;
SET last_used = '2020-04-28 13:10:03';
WHERE proxy_id = 1;

Я хочу сделать это одним оператором sql, вместо того, чтобы выполнять 2 оператора. Моя попытка этого не сработала:

UPDATE proxy_table
SET
    CASE
        WHEN current_requests + 1 = 20
        THEN current_requests = 0, last_cool_down = '2020-04-28 13:10:03' 
        ELSE current_requests = current_requests + 1
    total_requests = total_requests + 1,
    last_used = '2020-04-28 13:10:03'
WHERE
proxy_id = 1

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

MySql имеет специальную функцию для использования измененных значений столбцов в выражениях оператора UPDATE, поэтому порядок присваиваний должен быть таким:

UPDATE proxy_table
SET last_cool_down = CASE WHEN current_requests + 1 = 20 THEN '2020-04-28 13:10:03' ELSE last_cool_down END,
    current_requests = CASE WHEN current_requests + 1 = 20 THEN 0 ELSE current_requests + 1 END,
    total_requests = total_requests + 1, 
    last_used = '2020-04-28 13:10:03'
WHERE proxy_id = 1 
0 голосов
/ 28 апреля 2020

Вы можете использовать выражения CASE для установки значений столбца в зависимости от текущего значения current_requests:

UPDATE proxy_table
SET
last_cool_down = CASE WHEN current_requests = 19 THEN '2020-04-28 13:10:03'
                      ELSE last_cool_down
                 END,
current_requests = CASE WHEN current_requests = 19 THEN 0 
                        ELSE current_requests + 1
                   END,
total_requests = total_requests + 1,
last_used = '2020-04-28 13:10:03'
WHERE proxy_id = 1

Демонстрация на dbfiddle

...