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

MySQL 跨庫跨表數據導入實戰:INSERT / REPLACE / IGNORE / ON DUPLICATE KEY UPDATE 全解析

     編輯:MySQL 綜合教學

MySQL 跨庫跨表數據導入實戰:INSERT / REPLACE / IGNORE / ON DUPLICATE KEY UPDATE 全解析

場景:庫 A 的 user(uid, username, email, password, regdate, salt) 導入庫 B 的 account(id, name, email, password, type, salt),僅導入 username, email, password, salt 且 regdate > 1418313600。本文對比四種導入策略的行為差異與適用場景。

表結構對齊


-- 庫 A
CREATE TABLE `A`.`user` (
  `uid` INT PRIMARY KEY AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL UNIQUE,
  `email` VARCHAR(100),
  `password` CHAR(64),
  `regdate` INT,
  `salt` CHAR(16)
);

-- 庫 B
CREATE TABLE `B`.`account` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL UNIQUE,
  `email` VARCHAR(100),
  `password` CHAR(64),
  `type` TINYINT DEFAULT 0,
  `salt` CHAR(16)
);

策略對比

策略SQL 範例衝突行為適用場景風險
INSERT INTOINSERT INTO B.account(name,email,password,salt) SELECT username,email,password,salt FROM A.user WHERE regdate>1418313600;主鍵/唯一鍵衝突報錯,整條語句回滾目標表確定無衝突(全新導入)衝突導致全量失敗
REPLACE INTOREPLACE INTO B.account(name,email,password,salt) SELECT username,email,password,salt FROM A.user WHERE regdate>1418313600;衝突時先刪除整行再插入,非導入列(如 type)重置為默認值需覆蓋整行、非導入列可重置誤刪寶貴數據(type、創建時間等)
INSERT IGNOREINSERT IGNORE INTO B.account(name,email,password,salt) SELECT username,email,password,salt FROM A.user WHERE regdate>1418313600;衝突行靜默跳過,不報錯、不寫入增量同步、只補缺漏、不覆蓋舊數據無法更新已有行的變更字段
INSERT ... ON DUPLICATE KEY UPDATEINSERT INTO B.account(name,email,password,salt) SELECT username,email,password,salt FROM A.user WHERE regdate>1418313600 ON DUPLICATE KEY UPDATE password=VALUES(password), salt=VALUES(salt);衝突時只更新指定列,保留其它列原值增量同步且需更新部分字段(如密碼、鹽值)需明確列出更新列,略繁瑣

關鍵前提:唯一索引

以上三種「衝突感知」策略(REPLACE/IGNORE/ON DUPLICATE KEY)要求目標表有主鍵或唯一索引。本例中 B.account.name 已有 UNIQUE,滿足條件。

跨服務器導入方案

若庫 A、B 在不同物理機:

  1. 中轉表法:mysqldump -h hostA -u u -p A user | mysql -h hostB -u u -p B 先同步到 B 庫臨時表,再跑上述跨表 SQL。
  2. ETL 工具:DataX、Kettle、Airflow 任務抽取 A → 轉換字段映射 → 載入 B,支援斷點續傳、限流、監控。
  3. 聯邦引擎:MySQL FEDERATED 引擎映射遠程表,本地直接 INSERT ... SELECT,但效能差、不支援事務,不推薦生產大量數據。

最佳實踐建議

  1. 優先用 INSERT ... ON DUPLICATE KEY UPDATE,精確控制更新列,保護業務關鍵字段(如 type、created_at)。
  2. 大批次(>10 萬行)分批提交(每 1000~5000 行),避免長事務鎖表、Binlog 膨脹。
  3. 導入前 SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復,顯著提速(InnoDB)。
  4. 導入後驗證:SELECT COUNT(*), COUNT(DISTINCT name) FROM B.account; 確認行數與唯一鍵數一致。
  5. 記錄導入日誌(時間、源表、目標表、影響行數、耗時),便於審計回溯。

「INSERT 保守、REPLACE 暴力、IGNORE 保守、ON DUPLICATE KEY 精準」——按業務對數據覆蓋/保留的容忍度選擇,跨庫導入不再踩坑。

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