我有一个有这些列的表
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
发布于 2020-04-28 00:25:02
可以使用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
发布于 2020-04-28 00:38:08
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
https://stackoverflow.com/questions/61470562
复制相似问题