測試環境常需大量規律性測試數據。本文展示如何通過存儲過程循環生成兩類編碼:兩位數 01-99、三位數 100-999,並驗證結果。
CREATE TABLE `test`.`ta` (
`a` VARCHAR(45) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`proc_tp` $$
CREATE PROCEDURE `proc_tp`(IN prex INT, IN max_val INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE s VARCHAR(500);
WHILE (i < 10 AND prex < max_val) DO
SET s = CONCAT(prex, i);
INSERT INTO ta (a) VALUES (s);
SET i = i + 1;
IF (i = 10 AND prex < max_val) THEN
SET prex = prex + 1;
SET i = 0;
END IF;
END WHILE;
END $$
DELIMITER ;
邏輯: 外層 prex 為十位/百位前綴,內層 i 為個位 0-9 循環。prex 從參數起始值遞增至 max_val-1。
-- 生成 A 類:01-99 (prex 0-9,max=10 即 prex<10)
CALL proc_tp(0, 10);
-- 生成 B 類:100-999 (prex 10-99,max=100 即 prex<100)
CALL proc_tp(10, 100);
SELECT * FROM ta ORDER BY CAST(a AS UNSIGNED);
-- 輸出:00,01,02...09,10,11...99,100,101...999
CREATE PROCEDURE `batch_insert_numbers`(
IN start_num INT, -- 起始數字
IN end_num INT, -- 結束數字(包含)
IN target_table VARCHAR(64), -- 目標表
IN target_col VARCHAR(64) -- 目標列
)
BEGIN
DECLARE v_sql TEXT;
DECLARE i INT DEFAULT start_num;
SET @sql = CONCAT('INSERT INTO `', target_table, '`(`', target_col, '`) VALUES ');
WHILE i <= end_num DO
SET @sql = CONCAT(@sql, '(', QUOTE(i), '),');
SET i = i + 1;
IF i % 1000 = 1 OR i > end_num THEN
SET @sql = CONCAT(LEFT(@sql, CHAR_LENGTH(@sql)-1), ';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = CONCAT('INSERT INTO `', target_table, '`(`', target_col, '`) VALUES ');
END IF;
END WHILE;
END;
優勢: 動態 SQL + 預處理 + 批次提交(每 1000 行),避免單條 INSERT 開銷,支援任意數字範圍、表、列。