चूंकि लूप का सुझाव एक प्रक्रिया प्रकार समाधान के लिए अनुरोध का अर्थ है। यह रहा मेरा।
कोई भी क्वेरी जो तालिका से लिए गए किसी एकल रिकॉर्ड पर काम करती है, उसे इस तरह से तालिका की प्रत्येक पंक्ति के माध्यम से चलाने के लिए एक प्रक्रिया में लपेटा जा सकता है:
DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
फिर यहां आपके उदाहरण के अनुसार प्रक्रिया है (स्पष्टता के लिए इस्तेमाल की जाने वाली तालिका_ए और तालिका_)
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO
INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
SET i = i + 1;
END WHILE;
End;
;;
फिर सीमांकक रीसेट करने के लिए मत भूलना
DELIMITER ;
और नई प्रक्रिया चलाते हैं
CALL ROWPERROW();
आप "INSERT INTO" लाइन में जो चाहें कर सकते हैं, जिसे मैंने केवल आपके उदाहरण अनुरोध से कॉपी किया है।
ध्यान से देखें कि "इंसर्ट इन्टो" लाइन का उपयोग यहां प्रश्न में लाइन को दर्शाता है। इस उत्तर के लिए टिप्पणियों के अनुसार आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी क्वेरी सिंटैक्टिक रूप से सही है जिसके लिए आप जिस एसक्यूएल का संस्करण चला रहे हैं।
साधारण मामले में जहां आपका आईडी क्षेत्र बढ़ा हुआ है और 1 पंक्ति में शुरू होता है, उदाहरण बन सकता है:
INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;
के साथ "सेलेक्ट काउंट" लाइन की जगह
SET n=10;
क्या आप केवल टेबल_ ए में पहले 10 रिकॉर्ड पर अपनी क्वेरी का परीक्षण करेंगे।
एक अंतिम बात। यह प्रक्रिया अलग-अलग तालिकाओं में घोंसला बनाने के लिए भी बहुत आसान है और एकमात्र तरीका था कि मैं एक तालिका पर एक प्रक्रिया कर सकता हूं जिसने गतिशील रूप से मूल तालिका की प्रत्येक पंक्ति से अलग-अलग संख्याओं को एक नई तालिका में डाला।
यदि आपको इसे तेजी से चलाने की आवश्यकता है, तो सुनिश्चित करें कि इसे सेट करने का प्रयास करें, यदि नहीं तो यह ठीक है। आप कर्सर के रूप में उपरोक्त को भी फिर से लिख सकते हैं लेकिन यह प्रदर्शन में सुधार नहीं कर सकता है। उदाहरण के लिए:
DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
DECLARE cursor_ID INT;
DECLARE cursor_VAL VARCHAR;
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO cursor_ID, cursor_VAL;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
END LOOP;
CLOSE cursor_i;
END;
;;
उन चर को घोषित करने के लिए याद रखें जिन्हें आप उसी प्रकार के रूप में उपयोग करेंगे, जो कि सारणीबद्ध तालिकाओं से हैं।
मेरी सलाह है कि जब आप कर सकते हैं तब सेट किए गए प्रश्नों के साथ जाएं, और यदि आपको करना है तो केवल सरल लूप या कर्सर का उपयोग करें।