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

MySQL表間數據複製實戰:INSERT INTO SELECT 全場景語法指南

     編輯:MySQL 資料庫相關知識

業務開發中頻繁需求:表間數據遷移、歸檔、初始化、去重同步。INSERT INTO ... SELECT單條SQL解決,避免應用層拆解循環。本文系統講解四大核心場景語法與實戰模板。

測試表結構

CREATE TABLE insertTest (id INT(4), name VARCHAR(12));
CREATE TABLE insertTest2 (id INT(4), name VARCHAR(12));
INSERT INTO insertTest VALUES (100,'liudehua'),(101,'zhourunfa'),(102,'zhouhuajian');

場景一:結構完全一致,全量複製

INSERT INTO 目標表 SELECT * FROM 來源表;
-- 例
INSERT INTO insertTest2 SELECT * FROM insertTest;

場景二:指定欄位複製(順序必須一一對應)

INSERT INTO 目標表 (欄位1, 欄位2, ...) SELECT 欄位1, 欄位2, ... FROM 來源表;
-- 例:僅複製id
INSERT INTO insertTest2 (id) SELECT id FROM insertTest;

場景三:僅同步目標表不存在的記錄(增量同步/去重)

INSERT INTO 目標表 (欄位1, 欄位2, ...)
SELECT 欄位1, 欄位2, ...
FROM 來源表 src
WHERE NOT EXISTS (
    SELECT 1 FROM 目標表 dst WHERE dst.比較欄位 = src.比較欄位
);

多行插入範例

INSERT INTO insertTest2 (id, name)
SELECT id, name FROM insertTest src
WHERE NOT EXISTS (SELECT 1 FROM insertTest2 dst WHERE dst.id = src.id);

單行插入範例(用DUAL虛表)

INSERT INTO insertTest (id, name)
SELECT 100, 'liudehua' FROM dual
WHERE NOT EXISTS (SELECT 1 FROM insertTest WHERE id = 100);

注意:MySQL/Oracle支援DUAL,SQL Server用VALUES或省略FROM。

進階場景:多表JOIN後插入

INSERT INTO target_table (col1, col2, col3)
SELECT a.col1, b.col2, c.col3
FROM table_a a
JOIN table_b b ON a.id = b.a_id
JOIN table_c c ON b.id = c.b_id
WHERE a.status = 1;

效能與避坑指南

場景建議
大表全量複製(>100萬行)分批次(LIMIT 50000 OFFSET ...),避免長事務、鎖升級、Binlog暴增
目標表有唯一索引用INSERT IGNORE或ON DUPLICATE KEY UPDATE替代NOT EXISTS,效能更優
跨資料庫複製INSERT INTO db1.tbl SELECT * FROM db2.tbl(同實例);異構用ETL工具或FEDERATED引擎
自增主鍵衝突目標表自增列不指定值,或SET @auto_inc=...調整起始值
字符集不一致確保兩表CHARSET一致,或CONVERT(col USING utf8mb4)

對比:REPLACE INTO vs INSERT IGNORE vs ON DUPLICATE KEY UPDATE

  • REPLACE INTO:唯一鍵衝突→刪除舊行→插入新行(觸發DELETE+INSERT觸發器,自增ID會變)
  • INSERT IGNORE:衝突→忽略不報錯,保留舊行
  • ON DUPLICATE KEY UPDATE:衝突→更新指定欄位,保留主鍵ID,最高效靈活

掌握INSERT INTO SELECT全場景語法,讓表間數據流轉從「代碼堆砌」變為「SQL一條龍」。

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