MySQL定时事件语法错误排查:保留指定数量文章的删除事件
MySQL事件报错排查与修正
你的SQL有两个关键问题导致1064语法错误:
- 默认分隔符冲突:MySQL默认用分号
;作为语句结束符,但BEGIN...END块里的分号会被提前识别为整个CREATE EVENT语句的结束,引发语法错误。 - LIMIT不支持表达式:
LIMIT row_count - 100里的表达式不被MySQL支持,LIMIT仅接受常量或预定义的用户变量。
修正后的完整SQL如下:
DELIMITER // USE travemdb; CREATE EVENT delete_old_rows ON SCHEDULE EVERY 1 MINUTE -- 测试用,实际改成 EVERY 1 MONTH DO BEGIN DECLARE row_count INT; DECLARE delete_limit INT; -- 统计目标类型文章数量 SELECT COUNT(*) INTO row_count FROM article WHERE article_type_id = 2; -- 计算需要删除的行数 SET delete_limit = row_count - 100; IF row_count >= 100 THEN -- 使用预定义变量作为LIMIT参数 DELETE FROM article WHERE article_type_id = 2 ORDER BY id -- 按id排序,删除旧的(假设id递增代表创建时间) LIMIT delete_limit; END IF; END // DELIMITER ;
额外说明
- 切换实际执行周期:把
EVERY 1 MINUTE改成EVERY 1 MONTH即可满足每月执行的需求。 - 确保事件调度器开启:可以执行
SHOW VARIABLES LIKE 'event_scheduler';查看状态,若为OFF,执行SET GLOBAL event_scheduler = ON;开启(重启MySQL后会失效,需在配置文件里永久设置)。
内容的提问来源于stack exchange,提问作者Friki
相关产品推荐
相关产品推荐

