INSERT INTO target_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE condition;
適用於表間數據遷移、歷史數據歸檔等場景。
-- 建表
CREATE TABLE person (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(40) NOT NULL DEFAULT '',
age INT NOT NULL DEFAULT 0,
info CHAR(50) NULL,
PRIMARY KEY (id)
);
CREATE TABLE person_old LIKE person;
-- 源表插入測試數據
INSERT INTO person_old VALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police');
-- 遷移數據 (顯式指定列,避免自增主鍵衝突)
INSERT INTO person(id,name,age,info) SELECT id,name,age,info FROM person_old;


| 方案 | 語法 | 行為 | 適用場景 |
|---|---|---|---|
| IGNORE | INSERT IGNORE INTO ... | 忽略重複行,不報錯 | 日誌導入、幂等寫入 |
| REPLACE | REPLACE INTO ... | 刪除舊行插入新行 | 需覆蓋舊數據 |
| ON DUPLICATE KEY UPDATE | INSERT ... ON DUPLICATE KEY UPDATE col=VALUES(col) | 更新衝突列 | 計數器、狀態同步 |
-- IGNORE 示例:第二次執行不報錯,不插入重複數據
INSERT IGNORE INTO person(id,name,age,info) SELECT id,name,age,info FROM person_old;


NULL 或指定值觸發自增,無需 SET IDENTITY_INSERT ONUPDATE person SET info='police' WHERE id BETWEEN 14 AND 17;

核心建議:
rows_affected 確認影響範圍DELETE FROM person WHERE id BETWEEN 14 AND 17;
| 特性 | DELETE | TRUNCATE |
|---|---|---|
| 速度 | 逐行刪除,慢 | 釋放數據頁,極快 |
| 事務日誌 | 記錄每行 | 僅記錄頁釋放 |
| 自增計數器 | 保留 | 重置為 1 |
| 觸發器 | 觸發 | 不觸發 |
| 回滾 | 支持 | 不支持 (隱式提交) |
-- MyISAM 測試 30 行數據
DELETE FROM person; -- 較慢
TRUNCATE TABLE person; -- 瞬間完成



SHOW TABLE STATUS LIKE 'person';


確認 Auto_increment 重置為 1。
INSERT、LOAD DATA INFILE 大幅降低網絡往返IGNORE 適合幂等導入,ON DUPLICATE KEY UPDATE 適合計數聚合DELETE 避免長事務鎖表affected_rows 防止誤操作