仅当第二个条件为真时才打开DUPLICATE KEY UPDATE

时间:2014-05-21 01:11:07

标签: mysql

如果第二个条件为真,我如何更新,似乎我的mysql版本在ON DUPLICATE语法结束时不允许WHERE。

INSERT INTO `proxies` (`proxy`,`response`,`PAYMENT`,`type`,`country`,`status`,`tier`,`last_checked`,`last_active`,`response_time`) 
VALUES ('111.9.204.96:8123','200','coolproxies','anon','China','active','3','1400624136','1400624136','1.577639') 
ON DUPLICATE KEY UPDATE `response`='200',`response_time`='1.577639',`type`='anon',`country`='China',`status`='active',`tier`='2',`last_checked`='1400624137'

这项工作正常,但我只需要在WHERE last_checked < '1400624137'为真时更新。

这就是执行此操作的查询。

INSERT INTO `proxies` (`proxy`,`response`,`PAYMENT`,`type`,`country`,`status`,`tier`,`last_checked`,`last_active`,`response_time`)
VALUES ('207.204.249.193:21320','200','scanner','anon','United States','active','1','1400633866','1400633866','1.59696')
ON DUPLICATE KEY UPDATE
`response_time` = IF(`last_checked` < '1400633866', '1.59696', `response_time`),
`status` = IF(`last_checked` < '1400633866', 'active', `status`),
`last_checked` = IF(`last_checked` < '1400633866', '1400633866', `last_checked`),
`last_active` = IF(`last_checked` < '1400633866', '1400633866', `last_active`);

2 个答案:

答案 0 :(得分:0)

我认为你需要做两件事:

 update . . . 
 where last_checked < '1400624137';

 insert ignore into proxies(. . .);

(或使用on duplicate key update不做任何事情。)

答案 1 :(得分:0)

在@GordonLinoff提到的2个查询中执行此操作的替代方法是使用this related question中描述的方法,您可以使用IF根据条件进行更新。

INSERT INTO `proxies` (...) 
VALUES (...) 
ON DUPLICATE KEY UPDATE
  my_column = IF(last_checked < '1400624137', VALUES(my_column), my_column)

基本上IF执行的是TRUE,然后将字段更新为新值,否则如果FALSE将其设置为当前值,则表示不会更改现有数据。