SELECT aurl FROM atab
WHERE aurl NOT IN (SELECT DISTINCT burl FROM btab);
注意:MySQL 5.0+ 才支援子查詢;NOT IN 遇 NULL 會導致空結果集,若 B 表欄位含 NULL,改用 NOT EXISTS。
SELECT aurl, aclass FROM atab
WHERE CONCAT(aurl, aclass) NOT IN (
SELECT DISTINCT CONCAT(burl, bclass) FROM btab
);
或使用 NOT EXISTS 避免 NULL 陷阱且效能更佳:
SELECT a.* FROM atab a
WHERE NOT EXISTS (
SELECT 1 FROM btab b
WHERE b.burl = a.aurl AND b.bclass = a.aclass
);
| 特性 | DELETE FROM tab | TRUNCATE TABLE tab |
|---|---|---|
| 可帶 WHERE | 是 | 否 |
| 觸發 Trigger | 是 | 否 |
| 回傳影響列數 | 實際刪除筆數 | 永遠為 0 |
| 自增計數器 | 保留 (除非無 WHERE) | 重置為 1 |
| 執行速度 | 逐行刪除,較慢 | 釋放頁面,極快 |
| 事務安全 | 可回滾 | 隱式提交,不可回滾 |
DELETE FROM atab WHERE 1; -- 永真條件,不重置 AUTO_INCREMENT
INSERT INTO atab (aurl)
SELECT burl FROM btab;
欄位順序、型別必須一一對應;若目標表有 NOT NULL 無預設值欄位,需在 SELECT 列出或確保來源表有值。
INSERT IGNORE INTO target (id, name)
SELECT id, name FROM source;
IGNORE 會跳過主鍵/唯一鍵衝突行,適合增量同步。