MySQL每日更新Event故障排查:拍卖网站到期商品成交逻辑问题
解决MySQL自动拍卖到期商品Event的问题
嘿,我来帮你搞定这个每日自动更新的MySQL Event!先看看你现有代码里的几个关键问题,再给你一个更高效的实现方案:
你的代码里的语法错误
- 变量赋值错误:不能直接用
set amt = SELECT COUNT(*) FROM ITEMS;,MySQL中给变量赋值查询结果必须用SELECT ... INTO ...语法 - 变量声明不规范:
declare test;没有指定数据类型,MySQL要求DECLARE变量时必须明确类型(比如declare test INT;),如果这个变量没用建议直接删掉 - WHILE循环语法不完整:缺少
DO关键字和END WHILE;闭合语句,而且逐行遍历所有商品的效率极低,完全没必要这么做
修正后的完整Event代码
假设你的表结构大致如下(如果和实际不符,你可以调整字段名):
ITEMS:包含item_id(商品ID)、end_date(到期日期,DATE类型)、buyer_id(买家ID,待更新)BIDS:包含item_id(关联商品)、user_id(出价用户ID)、bid_amount(出价金额)
下面是实现需求的优化版Event:
DELIMITER $$ CREATE EVENT `auto_assign_buyer` ON SCHEDULE EVERY 1 DAY STARTS '2018-05-03 21:00:00' ON COMPLETION PRESERVE DO BEGIN -- 更新当日到期且有出价的商品,将最高出价者设为买家 UPDATE ITEMS i JOIN ( -- 找出每个商品的最高出价对应的用户ID SELECT item_id, user_id FROM BIDS b WHERE (b.item_id, b.bid_amount) IN ( SELECT item_id, MAX(bid_amount) FROM BIDS GROUP BY item_id ) ) highest_bids ON i.item_id = highest_bids.item_id -- 筛选条件:当日到期且还未分配买家 WHERE DATE(i.end_date) = CURDATE() AND i.buyer_id IS NULL; END $$ DELIMITER ;
关键注意事项
- 开启事件调度器:MySQL默认可能关闭了事件调度,你需要先执行这个命令开启:
要让这个设置永久生效,需要修改SET GLOBAL event_scheduler = ON;my.cnf(或my.ini)文件,添加event_scheduler = ON然后重启MySQL服务。 - 权限检查:创建Event需要用户拥有
EVENT权限,你可以用这个命令赋予权限:GRANT EVENT ON your_database.* TO 'your_user'@'localhost'; - 时区验证:确保MySQL的时区设置正确,避免触发时间和预期不符,可以用
SELECT @@time_zone;查看,必要时调整。
内容的提问来源于stack exchange,提问作者Wiley Mutch
相关产品推荐
相关产品推荐

