Tài liệu MySQL về Tuyên bố kiểm soát luồng nói:
Tài liệu trên Chương trình và Chế độ xem được Lưu trữ nói:
Vì vậy, có vẻ như bạn chỉ có thể chạy một vòng lặp rõ ràng trong một thủ tục, hàm hoặc trình kích hoạt được lưu trữ.
Tùy thuộc vào những gì bạn làm trong câu lệnh SQL của mình, có thể được chấp nhận sử dụng một bảng (hoặc chế độ xem) các số ( Tạo" Bảng Numbers "trong mysql , MYSQL:Bảng số tuần tự ).
Nếu truy vấn của bạn là SELECT
và có thể trả về kết quả của SELECT
của bạn 10 lần với một tập kết quả dài (thay vì 10 tập kết quả riêng biệt), bạn có thể làm như sau:
SELECT MainQuery.*
FROM
(
SELECT 1 AS Number
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
) AS Numbers
CROSS JOIN
(
SELECT 'some data' AS Result
) AS MainQuery
Ví dụ cho INSERT
Tôi khuyên bạn nên có một bảng số vĩnh viễn trong cơ sở dữ liệu của bạn. Nó hữu ích trong nhiều trường hợp. Xem các liên kết ở trên cách tạo nó.
Vì vậy, nếu bạn có một bảng Numbers
với int
cột Number
với các giá trị từ 1 đến, giả sử, 100K (như tôi làm) và khóa chính trên cột này, sau đó thay vì vòng lặp này:
DECLARE count INT DEFAULT 0;
WHILE count < 10 DO
INSERT INTO table_name(col1,col2,col3)
VALUES("val1","val2",count);
SET count = count + 1;
END WHILE;
bạn có thể viết:
INSERT INTO table_name(col1,col2,col3)
SELECT ("val1", "val2", Numbers.Number-1)
FROM Numbers
WHERE Numbers.Number <= 10;
Nó cũng sẽ hoạt động nhanh hơn gần 10 lần.