我有一个包含这些列的表
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
答案 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
答案 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