首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 建立空表兩大技巧差異深度解析:CREATE TABLE ... LIKE vs SELECT

     編輯:MySQL 資料庫相關知識

核心差異一覽

特性CREATE TABLE ... LIKECREATE TABLE ... SELECT
複製索引、主鍵、自增屬性✅ 完全保留❌ 丟失(AUTO_INCREMENT 變預設值 0)
複製儲存引擎✅ 保留原引擎❌ 改為預設引擎(通常 MyISAM)
複製欄位屬性(NOT NULL、DEFAULT、CHARSET)✅ 完全一致⚠️ 可能轉型(VARCHAR→CHAR 等)
複製資料❌ 僅結構✅ 可帶資料(加 WHERE 1=0 可只取結構)
適用場景建立同結構新表、分區表範本、測試環境克隆快速建立含資料的報表表、ETL 中繼表

實測驗證(MySQL 5.7)

原表結構

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

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

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_INCREMENT attribute is not preserved, and VARCHAR columns can become CHAR columns.

—— MySQL Reference Manual

最佳實踐建議

  1. 需要完整結構(含索引、引擎、自增) → CREATE TABLE new_tbl LIKE old_tbl;
  2. 需要同時複製資料 → CREATE TABLE new_tbl LIKE old_tbl; INSERT INTO new_tbl SELECT * FROM old_tbl;(兩步驟,結構與資料分離,較安全)
  3. 僅需部分欄位或經轉換的資料 → CREATE TABLE new_tbl SELECT col1, UPPER(col2) ... FROM old_tbl;
  4. 大表複製:考慮 INSERT ... SELECT 分批次、或使用 pt-archiver、mysqldump --no-create-info 等工具避免長鎖表。

結語

LIKE 是「結構克隆」,SELECT 是「結構推導+資料複製」。混淆兩者會導致索引遺失、引擎變更、自增屬性消失,進而影響效能與資料完整性。根據業務目的選擇正確語法,是 DBA 與開發者的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved