INSERT 語法完整形態
-- 1. 完整欄位值(須按建表順序)
INSERT INTO tbl VALUES (val1, val2, ...);
-- 2. 指定欄位(推薦,防結構變更失效)
INSERT INTO tbl (col1, col2) VALUES (val1, val2);
-- 3. 多行批次(單條 SQL,效能最佳)
INSERT INTO tbl (col1, col2) VALUES
(v11, v12), (v21, v22), ... (vN1, vN2);
-- 4. SET 語法(可讀性佳,僅單行)
INSERT INTO tbl SET col1=val1, col2=val2;
-- 5. 運算式引用前欄位
INSERT INTO tbl (a, b) VALUES (10, a*2); -- 合法
INSERT INTO tbl (a, b) VALUES (b*2, 10); -- 非法
REPLACE vs INSERT ... ON DUPLICATE KEY UPDATE
| 特性 | REPLACE | ON DUPLICATE KEY UPDATE |
| 機制 | DELETE + INSERT | 原地 UPDATE |
| AUTO_INCREMENT | 可能改變 | 保持不變 |
| 觸發器 | 觸發 DELETE/INSERT | 觸發 UPDATE |
| 外鍵 CASCADE | 觸發級聯刪除 | 不觸發 |
| 效能 | 較差 | 優 |
| 回傳行數 | 刪除+插入 | 1=新增, 2=更新 |
結論:生產環境優先用 ON DUPLICATE KEY UPDATE,REPLACE 僅用於確需重建行的場景。
INSERT ... SELECT 跨表複製
-- 完整複製
INSERT INTO target_tbl SELECT * FROM source_tbl;
-- 指定欄位 + 條件
INSERT INTO archive_log (id, msg, created)
SELECT id, msg, created FROM log WHERE created < '2023-01-01';
-- 禁止:目標表出現在 FROM 子句(ANSI 標準禁止)
-- INSERT INTO t SELECT * FROM t; -- 錯誤
LOAD DATA INFILE 最高效批次匯入
LOAD DATA [LOCAL] INFILE 'file.txt'
[REPLACE | IGNORE]
INTO TABLE tbl
[CHARACTER SET utf8mb4]
[FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\']
[LINES TERMINATED BY '\n']
[IGNORE 1 LINES] -- 跳過標題行
[(col1, col2, ...)]; -- 指定欄位順序
關鍵參數對照
| 參數 | 用途 | 預設 |
| LOCAL | 客戶端讀檔 → 伺服器 | 否(伺服器讀檔) |
| REPLACE | 唯一鍵衝突覆蓋 | 報錯 |
| IGNORE | 唯一鍵衝突跳過 | 報錯 |
| FIELDS TERMINATED BY | 欄位分隔符 | \t (Tab) |
| ENCLOSED BY | 欄位包裹字符 | 無 |
| ESCAPED BY | 跳脫字符 | \\ |
| LINES TERMINATED BY | 行結束符 | \n |
mysqlimport 命令列封裝
# 等同 LOAD DATA,檔名決定表名
mysqlimport -u root -p --local --fields-terminated-by=, --fields-enclosed-by='"' db_name file.txt
效能優化黃金法則
- 批次大小:INSERT 批次 1,000~5,000 行,LOAD DATA 無上限
- 關閉檢查:
SET unique_checks=0; foreign_key_checks=0; 匯入後開啟
- 關閉索引:MyISAM
ALTER TABLE DISABLE KEYS,InnoDB 無效
- 事務包裹:InnoDB 批次 INSERT 單事務提交
- 並行匯入:分區表/分表平行 LOAD DATA
常見陷阱避坑
- CSV 匯入:
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
- Windows 換行:
LINES TERMINATED BY '\r\n'
- NULL 值:檔案用
\N 表示,非空字串 'NULL'
- 編碼不匹配:
CHARACTER SET utf8mb4 強制指定
- 權限不足:需
FILE 權限(非 LOCAL 時)
- 上一篇文章: MySQL 主從複制配置完整指南:GTID 模式、雙主架構、故障切換與監控
- 下一篇文章: MySQL UPDATE/DELETE 資料修改刪除實戰:語法、條件構建、效能優化與安全防護
Copyright ©
程式碼之家 All Rights Reserved