資料表複製是資料庫運維高頻操作,不同場景需選擇最適方案。本文歸納 8 種常用方法並標註優缺點,助您精準選型。
| # | 方法 | SQL 範例 | 複製內容 | 優點 | 缺點/注意 |
|---|---|---|---|---|---|
| 1 | CREATE TABLE ... SELECT | CREATE TABLE new_tbl SELECT * FROM old_tbl | 結構+資料 | 單語句完成 | 丟失主鍵、索引、AUTO_INCREMENT,需手動補齊 |
| 2 | CREATE TABLE ... WHERE 1=2 | CREATE TABLE new_tbl SELECT * FROM old_tbl WHERE 1=2 | 僅結構 | 語法簡單 | 同方法 1,丟失約束;推薦用 LIKE |
| 3 | CREATE TABLE ... LIKE | CREATE TABLE new_tbl LIKE old_tbl | 僅結構 | 完整保留索引、主鍵、約束 | 不複製資料 |
| 4 | INSERT ... SELECT(結構相同) | INSERT INTO new_tbl SELECT * FROM old_tbl | 僅資料 | 高效批量寫入 | 需目標表結構已存在且兼容 |
| 5 | INSERT ... SELECT(結構不同) | INSERT INTO new_tbl(c1,c2) SELECT c1,c2 FROM old_tbl | 僅資料 | 欄位映射靈活 | 需手動對應欄位順序與類型 |
| 6 | SELECT * INTO(SQL Server 語法) | SELECT * INTO tbl2 FROM tbl1 WHERE 1=2 | 僅結構 | 語法直觀 | MySQL 不支援,僅 SQL Server/PostgreSQL 可用 |
| 7 | SHOW CREATE TABLE | SHOW CREATE TABLE old_tbl | 結構 DDL | 獲取精確建表語句 | 需手動修改表名後執行 |
| 8 | mysqldump 導出導入 | mysqldump db tbl > tbl.sql → mysql db < tbl.sql | 結構+資料 | 完整保留所有物件屬性 | 涉及檔案 I/O,大表較慢 |
CREATE TABLE new LIKE old; INSERT new SELECT * FROM old;(最穩健)CREATE TABLE new LIKE old;mysqldump + 手動調整 DDL 後導入WHERE id BETWEEN ... 分批 INSERT,避免長事務與鎖爭用核心提醒:CREATE TABLE ... SELECT 看似便捷,實則為「查詢結果建表」,絕不保留任何索引與約束,切勿用於需保持結構一致的場景。