四大複製場景速查表
| 場景 | SQL 語句 | 適用版本 | 說明 |
| 複製結構 + 數據 | CREATE TABLE new_tbl SELECT * FROM old_tbl; | 全版本 | 不複製索引、外鍵、觸發器 |
| 僅複製結構 (WHERE 1=2) | CREATE TABLE new_tbl SELECT * FROM old_tbl WHERE 1=2; | 全版本 | 條件永假,無數據返回 |
| 僅複製結構 (LIKE) | CREATE TABLE new_tbl LIKE old_tbl; | MySQL 4.0.25+ | 推薦:完整複製索引、約束、默認值 |
| 同結構表數據複製 | INSERT INTO new_tbl SELECT * FROM old_tbl; | 全版本 | 列順序必須一致 |
| 不同結構表數據複製 | INSERT INTO new_tbl (c1,c2) SELECT c1,c2 FROM old_tbl; | 全版本 | 顯式列映射,順序可不同 |
關鍵差異詳解
CREATE TABLE ... SELECT vs CREATE TABLE ... LIKE
| 特性 | SELECT 方式 | LIKE 方式 |
| 索引 | ❌ 不複製 | ✅ 完整複製 |
| 主鍵/唯一鍵 | ❌ 丟失 | ✅ 保留 |
| 外鍵 | ❌ 丟失 | ✅ 保留 |
| 默認值 | ❌ 丟失 | ✅ 保留 |
| AUTO_INCREMENT | ❌ 重置為 1 | ✅ 保留計數器 |
| 觸發器 | ❌ 不複製 | ❌ 不複製 |
| 分區定義 | ❌ 不複製 | ✅ 保留 |
實戰最佳實踐
場景 1:建立測試表(保留完整結構)
CREATE TABLE test_orders LIKE orders;
INSERT INTO test_orders SELECT * FROM orders WHERE create_time > '2024-01-01';
場景 2:跨庫遷移結構
# 導出結構
mysqldump -d -u root -p db_name table_name > structure.sql
# 導入目標庫
mysql -u root -p target_db < structure.sql
場景 3:大表分批複製數據(避免長事務)
-- 假設主鍵 id 連續
INSERT INTO new_tbl SELECT * FROM old_tbl WHERE id BETWEEN 1 AND 10000;
INSERT INTO new_tbl SELECT * FROM old_tbl WHERE id BETWEEN 10001 AND 20000;
-- 配合應用層循環或存儲過程批量執行
版本兼容性提醒
- MySQL 4.0.25 不支援
LIKE 子句,需用 WHERE 1=2 替代
- 5.0+ 完整支援所有語法
CREATE TABLE ... SELECT 在 8.0 中若來源表有隱藏列可能報錯,建議顯式列出列名