3

我正在尝试使用此查询每隔几分钟更新一次“idleTime”列。我只想在数据库中的值较小的情况下更新它!

    INSERT INTO
          bl_statistics (id, date, idleTime) 
    VALUES
          ("", DATE_FORMAT(NOW(), "%Y-%m-%d"), "1.01234") 
    ON DUPLICATE KEY UPDATE 
          idleTime=if(VALUES(idleTime) < 1.01234, VALUES(idleTime), "1.01234");

无论如何,值总是被覆盖,我是否遗漏了什么或者不可能以这种方式更新值?

4

3 回答 3

3

您的实现非常正确,但我认为您没有UNIQUE在 column 上指定约束date

要做到这一点,

ALTER TABLE bl_statistics ADD CONSTRAINT tb_uq UNIQUE(date)

并执行这条语句,

INSERT INTO bl_statistics(`id`, `date`, `idleTime`)
VALUES(NULL, '2013-05-30 00:00:00', 2)
ON DUPLICATE KEY UPDATE idleTime = IF(idleTime < 2, 2, idleTime)

这是完整工作演示的链接:http ://www.sqlfiddle.com/#!2/87bab/1

哦,还有一件事,不要将日期存储为字符串,而是将其存储为DATETIMEor DATE

于 2013-05-30T01:59:23.857 回答
1

如果您尝试更新值,为什么要使用insert

update bl_statistics
    set idleTime = 1.01234,
        date = DATE_FORMAT(NOW(), "%Y-%m-%d")
    where idleTime < 1.01234 and id = ''
于 2013-05-30T01:21:30.247 回答
0

您应该能够通过UPDATE声明来做到这一点。

使用您的示例,尝试这样的事情:

update bl_statistics
set date = current_date(),
  idleTime = greatest(idleTime,"1.01234")
where id = ""
于 2013-05-30T01:23:02.203 回答