如果列大于值,则更新列

时间:2020-04-28 00:10:02

标签: mysql sql database if-statement sql-update

我有一个包含这些列的表

  • 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_requestslast_used。但是,在上面的代码中,它没有考虑这种情况。如果为current_requests + 1 == 20,则为current_requests = 0last_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 :(得分:0)

您可以使用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

Demo on dbfiddle

答案 1 :(得分:0)

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 
相关问题