3

このクエリを使用して、列「idleTime」を数分ごとに更新しようとしています。DBの値が小さい場合にのみ更新したいと思います!

    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あなたの実装はかなり正しいですが、列に制約を指定していないと思います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

ああ、もう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 に答える