核心語法:自我複製倍增
-- 基本形式:將表資料再插入自己
INSERT INTO `table_name` (`col1`, `col2`, ...)
SELECT `col1`, `col2`, ... FROM `table_name`;
主鍵自增欄位處理
- 主鍵為 AUTO_INCREMENT:不可 在 INSERT 清單與 SELECT 清單中包含主鍵欄位,讓資料庫自動產生新 ID。
- 主鍵非自增/手動指定:需自行計算新 ID (如
MAX(id)+ROW_NUMBER())。
實戰範例
-- 建立測試表
CREATE TABLE `t_user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`email` VARCHAR(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 插入種子資料
INSERT INTO `t_user` (`name`,`email`) VALUES ('Alice','alice@test.com'),('Bob','bob@test.com');
-- 第一次倍增:2 → 4 筆
INSERT INTO `t_user` (`name`,`email`) SELECT `name`,`email` FROM `t_user`;
-- 第二次倍增:4 → 8 筆
INSERT INTO `t_user` (`name`,`email`) SELECT `name`,`email` FROM `t_user`;
-- 第 N 次:指數級增長 2^N
進階:帶條件/轉換的批量產生
-- 複製並修改部份欄位 (如加前綴區分批次)
INSERT INTO `t_user` (`name`,`email`)
SELECT CONCAT('batch2_', `name`), CONCAT('batch2_', `email`) FROM `t_user`;
-- 僅複製符合條件的資料
INSERT INTO `t_user` (`name`,`email`)
SELECT `name`,`email` FROM `t_user` WHERE `id` > 100;
效能與注意事項
| 項目 | 建議 |
| 單次筆數 | 建議 < 50 萬筆,超過請分批 LIMIT |
| 事務控制 | 大批次建議 SET autocommit=0; ... COMMIT; 或工具 pt-archiver |
| Binlog 膨脹 | 測試環境可暫時 SET sql_log_bin=0; (需 SUPER 權限) |
| 主從延遲 | 大量寫入會導致 Slave 延遲,生產嚴禁直接操作 |
| 索引維護 | 批量寫入後執行 ANALYZE TABLE 更新統計資訊 |
替代方案:專用測試資料生成工具
- mysqlslap:官方壓力測試工具,可自動生成查詢負載。
- dbforge / Data Generator:視覺化定義資料規則、關聯、分布。
- Python Faker + SQLAlchemy:程式化生成高度客製化測試資料。