MariaDB带JOIN的DELETE无法用LIMIT,求助批量删除实现方案
多表JOIN批量删除+事件调度器实现方案
问题核心
MySQL不支持在多表JOIN的DELETE语句后直接追加LIMIT,即便是内连接也不行,得换写法绕开这个语法限制。
实现思路
先通过嵌套子查询批量获取符合条件的invitations表ID(在子查询里加LIMIT控制单次删除量),再根据这些ID删除对应数据行,以此实现批量删除的效果。
完整事件调度器代码
SET GLOBAL event_scheduler = ON; CREATE EVENT invitation_cleaner_event ON SCHEDULE EVERY 1 DAY STARTS '2023-05-26 04:00:00' DO BEGIN REPEAT DO SLEEP(1); DELETE FROM invitations WHERE id IN ( SELECT id FROM ( SELECT invitations.id FROM invitations JOIN events ON events.id = invitations.event_id WHERE (...) -- 填入你的过滤条件 LIMIT 10 ) AS temp_table ); UNTIL ROW_COUNT() = 0 END REPEAT; END
关键细节说明
- 嵌套一层临时表
temp_table是因为MySQL不允许在DELETE的WHERE子句中直接引用当前被操作的表,临时表可以规避这个限制。 LIMIT 10控制每次循环删除10行,可根据数据库性能调整这个数值。SLEEP(1)是为了降低批量删除对服务器的压力,可根据实际场景调整睡眠时间。
内容的提问来源于stack exchange,提问作者brcebn
相关产品推荐
相关产品推荐

