| 特性 | CREATE TABLE ... LIKE | CREATE TABLE ... SELECT |
|---|---|---|
| 複製索引、主鍵、自增屬性 | ✅ 完全保留 | ❌ 丟失(AUTO_INCREMENT 變預設值 0) |
| 複製儲存引擎 | ✅ 保留原引擎 | ❌ 改為預設引擎(通常 MyISAM) |
| 複製欄位屬性(NOT NULL、DEFAULT、CHARSET) | ✅ 完全一致 | ⚠️ 可能轉型(VARCHAR→CHAR 等) |
| 複製資料 | ❌ 僅結構 | ✅ 可帶資料(加 WHERE 1=0 可只取結構) |
| 適用場景 | 建立同結構新表、分區表範本、測試環境克隆 | 快速建立含資料的報表表、ETL 中繼表 |
CREATE TABLE t_old (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
content VARCHAR(8000) NOT NULL,
`desc` VARCHAR(100) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE t_select SELECT * FROM t_old WHERE 1=0;
SHOW CREATE TABLE t_select\G
-- 結果:
-- ENGINE=MyISAM
-- id BIGINT UNSIGNED NOT NULL DEFAULT '0' <-- 失去 AUTO_INCREMENT
-- 無 UNIQUE KEY
CREATE TABLE t_like LIKE t_old;
SHOW CREATE TABLE t_like\G
-- 結果:
-- ENGINE=InnoDB
-- id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
-- UNIQUE KEY `id` (`id`) <-- 完整保留
Data type conversion may occur. For example, the
AUTO_INCREMENTattribute is not preserved, andVARCHARcolumns can becomeCHARcolumns.
—— MySQL Reference Manual
CREATE TABLE new_tbl LIKE old_tbl;CREATE TABLE new_tbl LIKE old_tbl; INSERT INTO new_tbl SELECT * FROM old_tbl;(兩步驟,結構與資料分離,較安全)CREATE TABLE new_tbl SELECT col1, UPPER(col2) ... FROM old_tbl;INSERT ... SELECT 分批次、或使用 pt-archiver、mysqldump --no-create-info 等工具避免長鎖表。LIKE 是「結構克隆」,SELECT 是「結構推導+資料複製」。混淆兩者會導致索引遺失、引擎變更、自增屬性消失,進而影響效能與資料完整性。根據業務目的選擇正確語法,是 DBA 與開發者的基本功。