Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วนลูปผ่านทุกแถวของตารางใน MySQL ด้วย Stored Procedure

การวนลูปอ่านข้อมูลทุกแถวในตาราง MySQL

MySQL ไม่มีคำสั่ง FOR/EACH LOOP โดยตรงใน SQL ธรรมดา แต่สามารถใช้ Stored Procedure ร่วมกับคำสั่ง WHILE เพื่อวนลูปผ่านทุกแถวของตารางได้

รูปแบบคำสั่ง (Syntax)

DELIMITER //
CREATE PROCEDURE yourProcedureName()
BEGIN
    DECLARE totalRows INT DEFAULT 0;
    DECLARE currentRow INT DEFAULT 0;
    
    SELECT COUNT(*) FROM yourTableName1 INTO totalRows;
    SET currentRow = 0;
    
    WHILE currentRow < totalRows DO
        INSERT INTO yourTableName2(yourColumnName, ...)
        SELECT (yourColumnName1, ...) 
        FROM yourTableName1 
        LIMIT currentRow, 1;
        
        SET currentRow = currentRow + 1;
    END WHILE;
END //
DELIMITER ;

ตัวอย่างการใช้งานจริง

1. สร้างตารางต้นทาง (AllRows)

CREATE TABLE AllRows (
    Id INT,
    Name VARCHAR(100)
);

เพิ่มข้อมูล:

INSERT INTO AllRows VALUES 
(1, 'John'),
(100, 'Carol'),
(300, 'Sam'),
(400, 'Mike');

2. สร้างตารางปลายทาง (SecondTableRows)

CREATE TABLE SecondTableRows (
    StudentId INT,
    StudentName VARCHAR(100)
);

3. สร้าง Stored Procedure สำหรับวนลูป

DELIMITER //
CREATE PROCEDURE Sp_AllRowsOfATable()
BEGIN
    DECLARE lastRows INT DEFAULT 0;
    DECLARE startRows INT DEFAULT 0;
    
    SELECT COUNT(*) FROM AllRows INTO lastRows;
    SET startRows = 0;
    
    WHILE startRows < lastRows DO
        INSERT INTO SecondTableRows(StudentId) 
        SELECT (Id) FROM AllRows LIMIT startRows, 1;
        SET startRows = startRows + 1;
    END WHILE;
END //
DELIMITER ;

4. เรียกใช้ Stored Procedure

CALL Sp_AllRowsOfATable();

5. ตรวจสอบผลลัพธ์

SELECT StudentId FROM SecondTableRows;
StudentId
1
100
300
400

หมายเหตุ: วิธีนี้เหมาะสำหรับการย้ายข้อมูลหรือประมวลผลแถวต่อแถว แต่ในทางปฏิบัติมักควรใช้คำสั่ง INSERT ... SELECT แบบ Set-based ซึ่งจะมีประสิทธิภาพดีกว่ามาก