萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL INSERT ... SELECT 複製表資料:單表、多表 JOIN、視圖嵌套三大場景全覆蓋

INSERT ... SELECT 是 MySQL 複製表資料、跨表同步、ETL 萃取的核心語法。本文涵蓋單表複製、多表 JOIN 組合、視圖嵌套三大場景,並針對「衍生表必須有別名」、「不可加 VALUES」、「字段對應」等常見語法陷阱詳細解析。

核心語法

INSERT INTO 目標表 (欄位1, 欄位2, ...)
SELECT 欄位1, 欄位2, ... FROM 來源表 [WHERE 條件];
  • 欄位數、順序、型別必須一一對應
  • 目標表自增欄位可省略或填 NULL
  • 嚴禁 加 VALUES 關鍵字

場景一:單表複製/備份/測試資料製造

-- 完整複製
INSERT INTO hotel_ktv (title, price, number, date, area, content, num)
SELECT title, price, number, date, area, content, num FROM hotel_ktv;

-- 條件複製 (如複製狀態=1 的記錄)
INSERT INTO archive_orders SELECT * FROM orders WHERE status = 1;

場景二:多表 JOIN 組合插入

需將多表關聯查詢結果寫入單一目標表:

INSERT INTO target_table (col_a, col_b, col_c)
SELECT t1.a, t2.b, t3.c
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.t1_id
JOIN table3 t3 ON t2.id = t3.t2_id
WHERE t1.status = 'active';

場景三:子查詢/視圖嵌套(必須加別名)

-- ✅ 正確:衍生表加別名 tb
INSERT INTO a (f1, f2)
SELECT * FROM (
  SELECT b.f1, c.f2 FROM b JOIN c ON b.id = c.b_id
) AS tb;

-- ❌ 錯誤:缺少別名
INSERT INTO a (f1, f2)
SELECT * FROM (SELECT b.f1, c.f2 FROM b JOIN c ON b.id = c.b_id);
-- ERROR 1248 (42000): Every derived TABLE must have its own alias

常見語法錯誤對照表

錯誤寫法錯誤代碼原因正確寫法
INSERT ... VALUES SELECT ...1064INSERT ... SELECT 不能有 VALUES移除 VALUES
子查詢無別名1248衍生表強制要求別名加 AS tb
欄位數不匹配1136SELECT 列數 ≠ 目標欄位數補齊/刪減欄位
自增欄位填值無報錯但值被忽略自增列建議不指定或填 NULL目標欄位列表略過自增欄位

進階技巧

1. 複製表結構 + 資料 (一條龍)

CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;

2. 分區表/分表資料合併

INSERT INTO all_logs SELECT * FROM logs_202301
UNION ALL SELECT * FROM logs_202302
UNION ALL SELECT * FROM logs_202303;

3. 避免主鍵衝突:INSERT IGNORE / ON DUPLICATE KEY UPDATE

-- 忽略重複主鍵/唯一鍵
INSERT IGNORE INTO target SELECT * FROM source;

-- 衝突時更新
INSERT INTO target (id, val) SELECT id, val FROM source
ON DUPLICATE KEY UPDATE val = VALUES(val);

效能建議

  • 大量資料:分批 WHERE id BETWEEN ...,配合事務提交
  • 目標表無索引時插入最快,遷移完成後再建索引
  • 超大量級 (億級) 改用 LOAD DATA INFILE 或 mysqldump --tab
INSERT ... SELECT 是資料搬遷的瑞士刀:單表複製、多表融合、歷史歸檔、測試造數,一條 SQL 搞定。記住「無 VALUES、衍生表要別名、欄位逐一對應」,避開 90% 語法坑。
copyright © 萬盛學電腦網 all rights reserved