MySQL 表複製深度對比:CREATE TABLE LIKE vs CREATE TABLE AS SELECT
MySQL 提供兩種表複製語法,行為差異巨大。本文從「結構複製完整性」「索引/約束/分區保留」「數據複製」「權限繼承」「性能」「靈活性」六大維度對比,給出場景化選型建議。
語法對比
| 語法 | 示例 | 複製內容 |
CREATE TABLE ... LIKE | CREATE TABLE new_tbl LIKE old_tbl; | 完整結構:列定義、索引、主鍵、外鍵、分區、自增值、表選項、字符集、校對規則 |
CREATE TABLE ... AS SELECT | CREATE TABLE new_tbl AS SELECT * FROM old_tbl LIMIT 0; | 僅列定義(數據類型、NULL/NOT NULL、默認值),**不含索引、主鍵、外鍵、分區、自增屬性、觸發器** |
六大維度深度對比
| 維度 | LIKE | AS SELECT |
| 索引/主鍵/唯一鍵 | ✅ 完整複製 | ❌ 全部丟失 |
| 外鍵約束 | ✅ 複製(需父表存在) | ❌ 不複製 |
| 分區表 | ✅ 複製分區定義 | ❌ 變為普通表 |
| 自增計數器 | ✅ 保留當前值 | ❌ 重置為 1 |
| 表選項 (ENGINE/CHARSET/COMMENT) | ✅ 完整複製 | ❌ 使用默認值 |
| 權限 (GRANTS) | ❌ 都不複製 | ❌ 都不複製 |
| 數據複製 | ❌ 無數據 | ✅ 可選列、可加 WHERE、可 LIMIT 0 只取結構 |
| 靈活性 | 低(全量複製) | 高(列投影、過濾、運算、別名、多表 JOIN) |
| 性能(大表結構) | 較快(元數據操作) | 需掃描數據(即使 LIMIT 0 也會解析 SELECT) |
場景化選型建議
- 建立分表/歸檔表/備份表結構 →
LIKE,保留索引約束,秒級完成。
- 構建寬表/報表表/數據集市 →
AS SELECT,靈活選列、轉換、聚合。
- 跨庫遷移結構 →
LIKE + mysqldump -d 導出 DDL 再導入。
- 測試環境快速構建 →
LIKE 複製結構,再 INSERT ... SELECT 抽樣數據。
補充:權限不複製的解決方案
CREATE TABLE t_like LIKE big_table; -- 0.03 sec
CREATE TABLE t_as SELECT * FROM big_table LIMIT 0; -- 0.12 sec (解析 SELECT 開銷)