如果列大于某个值,则更新列

Posted

技术标签:

【中文标题】如果列大于某个值,则更新列【英文标题】: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_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

【问题讨论】:

使用case 声明。 @zealous 我试过了(编辑了我的答案)但我无法得到它 【参考方案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_requestslast_cool_down 之前更新为0 这对我不起作用。它更新了last_usedtotal_requests,但没有别的。 @ZoeyMalkov 我的错,last_cool_down 的更新是对的。我忘记了 mysqlfeature 不是标准 SQL。无论如何,我已经创建了一个演示,它显示了正确的查询工作。查看我的编辑。 我这样做了,但它仍然不起作用。仅更新 last_cool_downcurrent_requests @ZoeyMalkov 如果您已正确输入查询,则current_requests 不会更新为0current_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_usedtotal_requests 但没有别的。 您所说的不起作用的代码与您接受的答案完全相同,但它是先发布的,早在另一个答案被编辑之前(它被编辑是因为我发布了我的答案使用正确的代码,您可以在评论中看到)。

以上是关于如果列大于某个值,则更新列的主要内容,如果未能解决你的问题,请参考以下文章

如何在postgresql中匹配列数,如果大于2,则更新表。

如果下拉列值更改为某个值,则动态禁用TextBoxFor

如果其他列不为空,则更新 3 列

如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列

如果 Oracle 中存在行值,则使用随机值更新行

如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期