2013-02-16 28 views
1

我已经创建了一个事件,它将根据插入行的平衡和时间,每5分钟后更新表'try_event'中的余额。根据MySQL中的代码不执行事件

事件代码:

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); 

但它毕竟是给5分钟balance=2500后。

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

2550 

1020 
+0

您是否设置了全局event_scheduler = ON? – 2013-02-16 19:50:53

+0

@BillKarwin YES – user1948493 2013-02-16 19:53:19

+0

@BillKarwin当我从事件代码中移除“(平衡> 2000和平衡<3000)”时,执行事件。 – user1948493 2013-02-16 19:58:28

回答

1

我刚刚创建在MySQL 5.5.29(实际上的Percona Server中,它的实例是MySQL的一个测试表一些补丁和新功能)。它工作正常,它更新了2500余额,并没有更新1000余额。

下面是一个检查表明更新发生(包括自动更新时间戳列):

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; 

是否有可能你的平衡列声明NOT NULL,所以UPDATE试图平衡设置为NULL,它只是失败?

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

+0

谢谢....行“ELSE BALANCE”解决了我的问题,现在事件正在正确执行。但有一点是,对于balance = 1000,“date_created”列未更新,而对于“blance = 2500”,它得到更新。 – user1948493 2013-02-17 06:30:26

+1

这是因为如果更新是无操作('SET Balance = Balance'),它不会被视为修改了任何行。如果你想更新,你必须明确地设置“date_created = NOW()”。 – 2013-02-17 08:04:45

+1

谢谢,现在我的活动正常工作:-) – user1948493 2013-02-17 09:09:42