1

行が挿入される残高と時間に応じて、5 分ごとにテーブル 'try_event' の残高を更新するイベントを作成しました。

イベントコード:

delimiter $$

CREATE EVENT `event`
ON SCHEDULE every 1 second  
DO 
begin
-- update balance by 2%
UPDATE try_event 
SET Balance = case 
WHEN timestampdiff(minute,date_created,current_timestamp) >0 and timestampdiff(minute,date_created,current_timestamp) MOD 5 = 0 and (balance>2000 and balance<3000) then Balance * 1.02 
end;
 end $$
delimiter ;

テーブル :

create table try_event(balance numeric(10,2) not null,date_created timestamp);

挿入された行:

insert into try_event values(2500,default);

insert into try_event values(1000,default);

しかし、それでもbalance=25005分後に与えています。

" " を削除すると(balance>2000 and balance<3000)、残高列全体が更新され、結果は次のようになります。

2550

1020
4

1 に答える 1

1

MySQL 5.5.29 (実際には、いくつかのパッチと新機能を備えた MySQL である Percona Server) のインスタンスでテスト テーブルを作成しました。それは正常に機能し、2500 の残高を更新し、1000 の残高を更新しませんでした。

更新が行われたことを示すチェックを次に示します (TIMESTAMP 列の自動更新を含む)。

mysql> SELECT timestampdiff(MINUTE, date_created, current_timestamp) AS td, 
              balance FROM try_event;
+------+---------+
| td   | balance |
+------+---------+
|    8 |    1000 |
|    3 |    2550 |
+------+---------+

イベント定義にわずかな変更を加えました。

CASE 式を使用する場合は、"ELSE" 句を表す価値があります。そうしないと、WHEN 条件が false で、ELSE 句がない場合、CASE 式の結果は NULL になります。

UPDATE try_event 
SET Balance = CASE 
WHEN timestampdiff(minute,date_created,current_timestamp) >0 
 AND timestampdiff(minute,date_created,current_timestamp) MOD 5 = 0 
 AND balance>2000 and balance<3000 
THEN Balance * 1.02 
ELSE Balance  -- this is what I added.
END;

残高列が NOT NULL と宣言されている可能性があるため、UPDATE は残高を NULL に設定しようとしていて、単に失敗していますか?

また、バランス範囲の比較を囲む括弧も削除しますが、違いはありません。

于 2013-02-16T20:42:27.903 に答える