我创建了一个事件,根据插入行的余额和时间,每隔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
答案 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并且它只是失败了?
我还删除了平衡范围比较周围的括号,但这不应该有任何区别。