MySQL存储过程循环超时

MySQL存储过程循环超时,mysql,Mysql,我有一个名为maptable的表,如下所示: occ_id name position 0124 Mark Jones 2 Hanna Smith 3 Frank Williams 4 0238 Henry Bassett 5 我试图“填写”occ_id栏中缺失的部分(也就是说,汉娜·史密斯和弗兰克·威廉姆斯也应该有occ_id 0124)

我有一个名为
maptable
的表,如下所示:

occ_id     name               position
0124       Mark Jones         2
           Hanna Smith        3 
           Frank Williams     4
0238       Henry Bassett      5
我试图“填写”occ_id栏中缺失的部分(也就是说,汉娜·史密斯和弗兰克·威廉姆斯也应该有occ_id 0124)

我想出了以下程序来完成这项工作,但有大约6000条记录,每当我运行它时,它都会超时:

CREATE DEFINER=`root`@`localhost` PROCEDURE `mapjoinid_1`()
MODIFIES SQL DATA
BEGIN
        DECLARE n INT DEFAULT 0;
        DECLARE i INT DEFAULT 0;
        SELECT COUNT(*) FROM maptable WHERE occ_id = '' INTO n;
        SET i=0;
                WHILE i < n DO
                UPDATE maptable m JOIN maptable mt ON (m.position - 1) = mt.position SET m.occ_id = mt.occ_id;
                SET i = i + 1;
                END WHILE;
        End
CREATE DEFINER=`root`@`localhost`过程`mapjoinid\u 1`()
修改SQL数据
开始
声明n INT默认值为0;
声明i INT默认值为0;
从occ_id=''的映射表中选择COUNT(*)到n;
设置i=0;
而我
更新映射表m JOIN映射表mt ON(m.position-1)=mt.position SET m.occ\U id=mt.occ\U id;
设置i=i+1;
结束时;
终点

是否有一种更有效的方法来循环或重复
update
语句,而该语句的处理时间不会太长?

效率问题很可能来自while循环中的连接声明。MySQL并不特别擅长运行这些类型的函数,因此一种解决方法是在MySQL更新中执行嵌套选择:。如果您不打算重复运行此过程(就像存储过程一样),那么我认为这是最有效的操作过程


超时也可能来自变量声明:仔细检查所有变量是否递增并正确存储。

我拼凑了来自不同来源的代码。你能给我举一个你所说的代码的例子吗?我遵循了您提供的链接,但它也使用了连接。