EVENT没有按照MySQL中的代码执行

时间:2013-02-16 17:23:30

标签: mysql

我创建了一个事件,根据插入行的余额和时间,每隔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);

INSERTED ROWS:

insert into try_event values(2500,default);

insert into try_event values(1000,default);

但仍然在5分钟后给出balance=2500

当我删除“(balance>2000 and balance<3000)”时,整个余额列会更新,结果为:

2550

1020

1 个答案:

答案 0 :(得分:1)

我刚刚在MySQL 5.5.29的实例上创建了一个测试表(实际上是Percona Server,它是带有一些补丁和新功能的MySQL)。它工作正常,它更新了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条件为假,并且没有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;

您的 balance 列是否可能被声明为NOT NULL,因此UPDATE尝试将余额设置为NULL并且它只是失败了?

我还删除了平衡范围比较周围的括号,但这不应该有任何区别。