2017-04-03 118 views
0

我有一個表稱爲maptable看起來像這樣:MySQL的存儲過程循環超時

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 

是否有LOOP更有效的方法,或重複update聲明哪裏處理不需要很長時間?

回答

0

效率問題很可能來自於while循環中的Join聲明。 MySQL並不是特別擅長運行這些函數,所以一個方法就是在你的MySQL更新中做一個嵌套選擇:MySQL - UPDATE query based on SELECT Query。如果您不打算重複運行此過程(就像存儲過程一樣),那麼我認爲這是最有效的操作過程。

超時也可能來自您的變量聲明:仔細檢查所有變量是否增加並正確存儲。

+0

我拼湊了來自不同來源的代碼。你能給我一個你正在談論的代碼的例子嗎?我遵循你提供的鏈接,但它也使用連接。 –