日常開發中頻繁需要「複製表結構」「複製結構+數據」「僅複製結構不帶數據」。本文總結 MySQL 原生語法的四種核心模式,並說明引擎、字符集、索引、自增列等屬性的繼承行為。
CREATE TABLE new_table LIKE old_table; -- 等效於:SHOW CREATE TABLE old_table 獲取 DDL 再執行 -- 特點:完整複製列定義、索引、主鍵、外鍵、ENGINE、CHARSET、AUTO_INCREMENT 當前值 -- 不複製:數據、TRIGGER、PARTITION 定義(5.7+ 已修復部分分區複製問題)
CREATE TABLE new_table SELECT * FROM old_table; -- 特點:列類型從 SELECT 列表推導,主鍵/索引/約束/自增屬性/ENGINE/CHARSET 均不複製 -- 適合:快速建立數據快照、導出報表表、異構遷移前臨時表
CREATE TABLE new_table SELECT * FROM old_table WHERE 1 = 2; -- 或 CREATE TABLE new_table SELECT * FROM old_table LIMIT 0; -- 原理:WHERE 條件恒為 FALSE,執行計劃不掃描數據頁,僅解析列元數據 -- 效果同 CREATE TABLE new_table LIKE old_table,但不複製索引/約束/引擎/字符集
| 屬性 | CREATE ... LIKE | CREATE ... SELECT * | CREATE ... SELECT ... WHERE 1=2 |
|---|---|---|---|
| 列定義/類型 | ✅ 完全一致 | ✅ 從 SELECT 推導 | ✅ 從 SELECT 推導 |
| 主鍵/唯一鍵 | ✅ 複製 | ❌ 不複製 | ❌ 不複製 |
| 普通索引 | ✅ 複製 | ❌ 不複製 | ❌ 不複製 |
| 外鍵約束 | ✅ 複製 | ❌ 不複製 | ❌ 不複製 |
| AUTO_INCREMENT | ✅ 保留當前值 | ❌ 重置為 1 | ❌ 重置為 1 |
| ENGINE | ✅ 複製 | ❌ 默認引擎 | ❌ 默認引擎 |
| CHARSET/COLLATION | ✅ 複製 | ❌ 默認字符集 | ❌ 默認字符集 |
| TRIGGER | ❌ 不複製 | ❌ 不複製 | ❌ 不複製 |
| PARTITION | ⚠️ 版本相關 | ❌ 不複製 | ❌ 不複製 |
#!/bin/bash
# clone_table.sh src_db.src_table dst_db.dst_table
SRC=$1; DST=$2
SRC_DB=${SRC%.*}; SRC_TBL=${SRC#*.}
DST_DB=${DST%.*}; DST_TBL=${DST#*.}
mysql -e "CREATE TABLE \`$DST_DB\`.\`$DST_TBL\` LIKE \`$SRC_DB\`.\`$SRC_TBL\`;"
mysql -e "INSERT INTO \`$DST_DB\`.\`$DST_TBL\` SELECT * FROM \`$SRC_DB\`.\`$SRC_TBL\`;"
# 可選:複製權限
mysql -e "SHOW GRANTS FOR CURRENT_USER;" | grep "$SRC_TBL" | sed "s/$SRC_TBL/$DST_TBL/g" | mysql