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=2500在 5 分钟后给出。

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

2550

1020
4

1 回答 1

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 试图将 balance 设置为 NULL 并且它只是失败了?

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

于 2013-02-16T20:42:27.903 回答