倒序删除表中数据的存储过程,带自引用关系的表挺有一套的。尤其是那种树状结构,比如分类表、评论表什么的,一条条删,顺序错了还真不行。这种写法思路清晰、逻辑简单,几行代码就搞定,响应也快,蛮适合你用来清理老数据的。
存储过程的逻辑不复杂,关键点就是用WHILE
循环从最大 ID 开始删,直到删光为止。写起来也就十几行,容易维护,而且不容易出错。你不用担心级联删除失败那种情况,自己控制顺序,踏实!
哦对了,要注意别直接上生产库哈,建议先在测试环境跑一遍。是如果表里有自关联(比如parent_id
那种),这个方式确实蛮靠谱的。代码也贴一下,方便你理解:
DELIMITER //
CREATE PROCEDURE delete_in_reverse()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cur_id INT;
DECLARE cur CURSOR FOR SELECT id FROM your_table ORDER BY id DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO cur_id;
IF done THEN
LEAVE read_loop;
END IF;
DELETE FROM your_table WHERE id = cur_id;
END LOOP;
CLOSE cur;
END;//
DELIMITER ;
如果你对存储过程感兴趣,还可以看看这些:
如果你手上正好有需要批量删除的老数据,尤其表结构还挺复杂,不妨试试看这种倒序删除的方式,简单直接,效果还不错。