表間資料複製是資料庫開發高頻操作。本文系統梳理目標表存在/不存在、全欄位/部分欄位、條件過濾等場景的標準 SQL 寫法與效能考量。
INSERT INTO `target_table` SELECT * FROM `source_table`;
INSERT INTO `target_table` (`col1`, `col2`, `col3`, `col4`)
SELECT `col1`, `col2`, `col3`, `col4`
FROM `source_table`
WHERE `status` = 'active';
-- MySQL / PostgreSQL / SQL Server / Oracle 通用語法
CREATE TABLE `new_table` AS
SELECT * FROM `source_table`;
CREATE TABLE `new_table` AS
SELECT `id`, `name`, `email`, `created_at`
FROM `source_table`
WHERE `status` = 1;
-- 範例:每批 5000 行,按主鍵範圍分批
SET @batch_size = 5000;
SET @max_id = (SELECT MAX(`id`) FROM `source_table`);
SET @min_id = (SELECT MIN(`id`) FROM `source_table`);
WHILE @min_id <= @max_id DO
INSERT INTO `target_table`
SELECT * FROM `source_table`
WHERE `id` >= @min_id AND `id` < @min_id + @batch_size;
SET @min_id = @min_id + @batch_size;
-- 可選:COMMIT; 釋放鎖、刷新 Binlog
END WHILE;
生產環境建議寫成存儲過程或應用層腳本執行,並監控 Innodb_row_lock_waits、Innodb_buffer_pool_wait_free 指標。
INSERT INTO `db_target`.`target_table` SELECT * FROM `db_source`.`source_table`;
-- 1. 建立連結遠程表的 FEDERATED 表
CREATE TABLE `remote_source` (
`id` INT NOT NULL,
`data` VARCHAR(255)
) ENGINE=FEDERATED
CONNECTION='mysql://user:pass@remote_host:3306/db_name/source_table';
-- 2. 像操作本地表一樣複製
INSERT INTO `local_target` SELECT * FROM `remote_source`;
mysqldump -h source_host -u user -p db_name table_name \
--single-transaction --quick --no-create-info \
| mysql -h target_host -u user -p target_db
DROP INDEX,複製後 CREATE INDEX,大幅加速寫入innodb_flush_log_at_trx_commit=2、innodb_log_file_size=1G 臨時調大SELECT ... INTO OUTFILE,再 LOAD DATA INFILE,比 INSERT 快 10-20 倍INSERT INTO t1 SELECT * FROM t2 當 t1、t2 結構不同時 → 明確列出欄位清單innodb_max_undo_log_sizemysqldump --routines --triggers 匯出表間複製看似簡單,實則涉及鎖、日誌、索引、字元集、事務隔離等核心機制。根據資料量、業務容忍度、架構拓撲選擇合適方案,是資料庫工程師的基本功。