首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 復制表結構與數據四大場景標準語法:僅結構、結構+數據、同結構數據遷移、異結構數據轉換

     編輯:MySQL 綜合教學

日常運維中頻繁需要「復制表」。本文給出四大標準場景的最簡 SQL,對比 CREATE TABLE ... LIKE、CREATE TABLE ... SELECT、INSERT ... SELECT 的適用邊界與性能差異。

場景一:僅復制表結構(無數據)

-- 方法 1:LIKE(最快,僅複製定義、索引、約束,不複製觸發器/外鍵)
CREATE TABLE new_tbl LIKE old_tbl;

-- 方法 2:WHERE 1=2(通用,可跨庫,不複製外鍵/觸發器)
CREATE TABLE new_tbl SELECT * FROM old_tbl WHERE 1=2;
  • LIKE 保留原表所有索引、約束、默認值、字符集;SELECT WHERE 1=2 僅保留列定義,**不保留索引/主鍵/自增/外鍵**,需手動補充。
  • 跨庫時:CREATE TABLE db2.new_tbl LIKE db1.old_tbl;

場景二:復制表結構 + 全量數據

CREATE TABLE new_tbl SELECT * FROM old_tbl;
  • 一條 SQL 完成建表+導入,**不保留主鍵/索引/外鍵/觸發器/自增屬性**,新表僅有列定義與數據。
  • 大表(>1000 萬行)會長時間鎖定源表(MyISAM)或產生大量 Binlog(InnoDB),建議分批或用 pt-archiver。

場景三:同結構表間全量數據遷移(目標表已存在)

INSERT INTO target_tbl SELECT * FROM source_tbl;
  • 要求源/目標表列數、順序、類型完全一致。
  • 大數據量分批:INSERT INTO target_tbl SELECT * FROM source_tbl WHERE id BETWEEN 1 AND 10000; 循環執行,避免長事務。

場景四:異結構表間數據轉換遷移(列不一致/順序不同)

INSERT INTO target_tbl (col_a, col_b, col_c)
SELECT src_x, src_y, src_z
FROM source_tbl
WHERE create_time > '2024-01-01';
  • 顯式列出目標列與源列,**順序一一對應**,類型隱式轉換由 MySQL 自動處理(建議顯式 CAST)。
  • 常用於「寬表→窄表」、「舊_schema→新_schema」遷移。

性能與鎖行為對比

語句鎖源表Binlog 量保留索引/約束適用場景
CREATE ... LIKE無(僅元數據)極小全保留建空表、Schema 同步
CREATE ... SELECT共享讀鎖 (MyISAM) / 行鎖 (InnoDB)大(全量行)不保留小表全量複製、建測試表
INSERT ... SELECT行鎖 (InnoDB)大目標表自有同結構遷移、歷史歸檔

最佳實踐建議

  1. 生產環境建空表用 LIKE,再 ALTER TABLE 補索引/分區,最後分批 INSERT ... SELECT 導數據。
  2. 大表遷移用 pt-online-schema-change 或 gh-ost** 在線無鎖遷移,業務零感知。
  3. 跨實例遷移:mysqldump -d 導結構,mysqldump -t 導數據,或用 mysqlpump 並行導出。
  4. 異構遷移:寫 ETL 腳本(Python/Spark/Flink)做類型轉換、清洗、校驗,不要在單條 SQL 硬轉。

選對語句,避免「建表快但無索引導致全表掃」、「導數據快但長鎖表導致業務卡頓」。

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