我直接用:delete from 表 where 字段 in (select 其他表) 条件用in的方式执行报错
[Err] 1206 - The total number of locks exceeds the lock table size
因为一次性要删除数据量太多了,每个都加了行锁,所以报错了,而且这样效率也不高,不稳定。
概述:
1.先查出删除条件 in 的范围值
2.将in值存储到游标,然后一个一个循环
3.根据循环值 删除表数据(一对多,索引列)
这样不是一次性删除,不用担心mysql表行锁的问题,运行也稳定不会出错,效率也是最高的
- CREATE DEFINER=`root`@`%` PROCEDURE `clean_old_defectData`()
- BEGIN
- #Routine body goes here...
- DECLARE COILNO VARCHAR(255);
- DECLARE COILNO_CURSOR_COUNT INT DEFAULT 1;
-
- -- 先查出删除条件 in 里面的值(我的是DELIVERYCOILNO),放到游标里
- DECLARE COILNO_CURSOR CURSOR FOR
- SELECT DELIVERYCOILNO FROM qualitydb.t_sg_mat_info WHERE STARTTIME BETWEEN '2021-01-01' AND '2021-07-01';
- -- 设置循环的次数(游标的大小)
- DECLARE EXIT HANDLER FOR NOT FOUND SET COILNO_CURSOR_COUNT = 0;
-
- OPEN COILNO_CURSOR;
-
- -- 循环游标
- WHILE COILNO_CURSOR_COUNT <> 0 DO
- FETCH COILNO_CURSOR INTO COILNO;
- -- INSERT INTO qualitydb.test(val2) VALUES(COILNO);
- -- 删除表数据,我这里有两个表要删除
- DELETE FROM qualitydb.t_sg_defect_info WHERE DELIVERYCOILNO = COILNO;
- DELETE FROM qualitydb.t_sg_defect_quality_result WHERE coil_id = COILNO;
- END WHILE;
-
- CLOSE COILNO_CURSOR;
- END