【问题标题】:UPDATE column if column is greater than a value如果列大于某个值,则更新列
【发布时间】:2020-04-28 00:10:02
【问题描述】:

我有一个包含这些列的表格

  • 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

【问题讨论】:

  • 使用case 声明。
  • @zealous 我试过了(编辑了我的答案)但我无法得到它

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


【解决方案1】:

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

【讨论】:

  • 我的问题是,last_cool_down 会更新吗?因为current_requests 在last_cool_down 之前更新为0
  • 这对我不起作用。它更新了last_used 和total_requests,但没有别的。
  • @ZoeyMalkov 我的错,last_cool_down 的更新是对的。我忘记了 MySQL 的 feature 不是标准 SQL。无论如何,我已经创建了一个演示,它显示了正确的查询工作。查看我的编辑。
  • 我这样做了,但它仍然不起作用。仅更新 last_cool_down 和 current_requests
  • @ZoeyMalkov 如果您已正确输入查询,则current_requests 不会更新为0 或current_requests+1
【解决方案2】:

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 

【讨论】:

  • 这对我不起作用。它更新 last_used 和 total_requests 但没有别的。
  • 您所说的不起作用的代码与您接受的答案完全相同,但它是先发布的,早在另一个答案被编辑之前(它被编辑是因为我发布了我的答案使用正确的代码,您可以在评论中看到)。
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多