MySQL 預存程序配合流程控制語句,能高效生成大量測試資料,避免應用層頻繁往返網路開銷。以下為標準範本,可直接調整表結構、欄位值與迴圈次數套用至實際專案。
DROP PROCEDURE IF EXISTS test_insert;
DELIMITER ;;
CREATE PROCEDURE test_insert()
BEGIN
DECLARE i INT DEFAULT 0;
WHILE i < 10 DO
INSERT INTO CMS.CMS_Module (
ModuleType,
ModuleName,
ModuleDescription,
DesignHtml,
QUERY
) VALUES (
'2',
CONCAT('活動', i),
'測試加入',
'aaaaaaaaaa',
''
);
SET i = i + 1;
END WHILE;
END;;
DELIMITER ;
CALL test_insert();
| 語法元素 | 說明 |
|---|---|
DELIMITER ;; |
暫時變更語句分隔符,避免程序體內的 ; 被誤判為結束 |
DECLARE i INT DEFAULT 0 |
宣告區域變數並初始化 |
WHILE ... DO ... END WHILE |
迴圈結構,支援複雜條件判斷 |
CONCAT('活動', i) |
字串串接,生成動態模組名稱 |
SET i = i + 1 |
迴圈計數器遞增 |
DELIMITER ; |
恢復預設分隔符 |
CALL test_insert() |
呼叫預存程序執行 |
COMMIT 批次提交(預設自動提交,大量時建議關閉 autocommit 手動控制)LAST_INSERT_ID() 取得自增 ID 寫入從表RAND()、FLOOR()、ELT() 生成多樣化測試值IN p_count INT 參數,呼叫時動態指定筆數:CALL test_insert(10000)LOAD DATA INFILE 或批次 INSERT ... VALUES (...), (...), ... 語法CREATE ROUTINE 權限,執行需 EXECUTE 權限SELECT i; 或寫入日誌表追蹤執行進度| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 預存程序 WHILE 迴圈 | 邏輯複雜、需流程控制、中小量資料 | 邏輯封裝在 DB、可重複呼叫、支援條件判斷 | 單筆 INSERT 效能較低、難以並行化 |
| 批次 INSERT 多值語法 | 大量同結構資料、單次執行 | 單次 SQL 寫入成千上萬行、效能極佳 | SQL 過長可能超過 max_allowed_packet、邏輯較死板 |
| LOAD DATA INFILE | 超大量資料匯入(百萬級+) | 速度最快、繞過 SQL 層解析 | 需檔案系統存取權限、格式要求嚴格 |
| 應用層批次寫入 | 跨系統、需事務控制、ORM 框架 | 彈性最高、易除錯、支援分散式事務 | 網路往返開銷大、受應用語言效能限制 |
預存程序批次插入是資料庫開發者工具箱中的利器,善用它能大幅簡化測試資料準備、歷史資料補齊、定時任務等常見操作。根據資料量與複雜度選擇最適方案,事半功倍。