源庫 A 表 users(uid, username, email, password, regdate, salt) → 目標庫 B 表 account(id, name, email, password, type, salt)。需導入 username, email, password, salt,且過濾 regdate > 1418313600。
所有「衝突處理」語法(REPLACE、IGNORE、ON DUPLICATE KEY)均要求目標表存在 PRIMARY KEY 或 UNIQUE INDEX。本例假設 account.name 有唯一索引。
INSERT INTO ... SELECTINSERT INTO `B`.`account` (`name`, `password`, `email`, `salt`)
SELECT `username`, `password`, `email`, `salt`
FROM `A`.`users`
WHERE `regdate` > 1418313600;
IGNORE 或預清洗REPLACE INTO ... SELECTREPLACE INTO `B`.`account` (`name`, `password`, `email`, `salt`)
SELECT `username`, `password`, `email`, `salt`
FROM `A`.`users`
WHERE `regdate` > 1418313600;
type)將重置為默認值INSERT IGNORE ... SELECTINSERT IGNORE INTO `B`.`account` (`name`, `password`, `email`, `salt`)
SELECT `username`, `password`, `email`, `salt`
FROM `A`.`users`
WHERE `regdate` > 1418313600;
INSERT ... ON DUPLICATE KEY UPDATE(推薦)INSERT INTO `B`.`account` (`name`, `password`, `email`, `salt`)
SELECT `username`, `password`, `email`, `salt`
FROM `A`.`users`
WHERE `regdate` > 1418313600
ON DUPLICATE KEY UPDATE
`password` = VALUES(`password`),
`salt` = VALUES(`salt`);
type 等其他列原值VALUES(col) 引用 INSERT 部分準備插入的值
目標表有數據嗎?
├─ 無 → 直接 INSERT
└─ 有 → 業務允許覆蓋非導入列嗎?
├─ 允許 → REPLACE(慎用)
├─ 不允許,保留舊數據 → INSERT IGNORE
└─ 需選擇性更新特定列 → ON DUPLICATE KEY UPDATE ✓
同一服務器跨庫可直接 SQL;跨服務器需中轉:
mysqldump → 導入目標服務器臨時庫 → 執行上述跨庫 SQLSELECT ... INTO OUTFILE → scp 文件 → 目標庫 LOAD DATA INFILE → 執行 SQLname)SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0; 導入後恢復並 COMMIT掌握四種語法的語義差異,結合業務對「歷史數據保留」與「增量同步」的具體要求,即可安全高效完成異構表跨庫數據融合。