การวนลูปอ่านข้อมูลทุกแถวในตาราง 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 ซึ่งจะมีประสิทธิภาพดีกว่ามาก