如果列大于某个值,则更新列
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_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 我试过了(编辑了我的答案)但我无法得到它
【参考方案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
但没有别的。
您所说的不起作用的代码与您接受的答案完全相同,但它是先发布的,早在另一个答案被编辑之前(它被编辑是因为我发布了我的答案使用正确的代码,您可以在评论中看到)。以上是关于如果列大于某个值,则更新列的主要内容,如果未能解决你的问题,请参考以下文章
如何在postgresql中匹配列数,如果大于2,则更新表。