MySQL 提供多樣化的插入語法:基本 INSERT、INSERT ... SELECT、REPLACE、LOAD DATA INFILE、mysqlimport。本文系統梳理各語法適用場景、參數細節、效能優化與避坑指南。
INSERT INTO worker VALUES ('tom', 'tom@yahoo.com');
-- 多行單語句 (3.22.5+)
INSERT INTO worker VALUES ('tom','tom@yahoo.com'), ('paul','paul@yahoo.com');
INSERT INTO worker (name) VALUES ('tom');
-- 多行
INSERT INTO worker (name) VALUES ('tom'), ('paul');
INSERT INTO worker SET name='tom', email='tom@yahoo.com';
INSERT INTO tbl (col1, col2) VALUES (15, col1*2); -- 合法
INSERT INTO tbl (col1, col2) VALUES (col2*2, 15); -- 非法:col2 尚未賦值
INSERT INTO tbl1 (col1, col2) SELECT col3, col4 FROM tbl2;
-- 省略目標列表(須一一對應)
INSERT INTO tbl1 SELECT col3, col4 FROM tbl2;
ORDER BY 子句。FROM 子句(ANSI SQL 禁止,避免自我引用死循環)。REPLACE INTO tbl (id, val) VALUES (1, 'new');
-- 等效邏輯:
-- IF EXISTS (SELECT 1 FROM tbl WHERE id=1) THEN DELETE ...; INSERT ...;
PRIMARY KEY 或 UNIQUE 索引,否則退化為 INSERT。REPLACE ... SELECT。DELETE 觸發器、外鍵級聯、自增 ID 重用等副作用。LOAD DATA [LOCAL] INFILE 'file_path'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS TERMINATED BY '\t' [OPTIONALLY] ENCLOSED BY '' ESCAPED BY '\\']
[LINES TERMINATED BY '\n']
[IGNORE n LINES]
[col_name_or_user_var, ...]
[SET col_name = expr, ...];
| 參數 | 說明 | 預設值 |
|---|---|---|
| LOCAL | 從客戶端讀檔;否則伺服器端讀檔(需 FILE 權限、檔案在 datadir/可讀目錄) | 無 |
| REPLACE | 唯一鍵衝突以新行覆蓋舊行 | 報錯中止 |
| IGNORE | 唯一鍵衝突跳過新行 | 報錯中止 |
| FIELDS TERMINATED BY | 欄位分隔符 | \t (Tab) |
| ENCLOSED BY | 欄位包圍字元(可加 OPTIONALLY 僅包字串型) | 空 |
| ESCAPED BY | 轉義字元 | \\ |
| LINES TERMINATED BY | 行結束符 | \n |
| IGNORE n LINES | 跳過前 n 行(如 CSV 標題行) | 0 |
LOAD DATA INFILE 'data.csv'
INTO TABLE tbl
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
\N (預設轉義) → 存為 SQL NULL。SELECT ... INTO OUTFILE 同理。mysqlimport [options] db_name file1.txt [file2.txt ...]
-- 選項對應 LOAD DATA 參數:
-- --fields-terminated-by=, --fields-enclosed-by=\" --ignore-lines=1 --local --replace --ignore
檔名即表名(去除副檔名),自動產生 LOAD DATA INFILE。
INSERT 改多值 VALUES (...),(...),(...),每批 500~5000 行,降低網絡往返與解析開銷。SET FOREIGN_KEY_CHECKS=0; SET UNIQUE_CHECKS=0; ALTER TABLE tbl DISABLE KEYS;ALTER TABLE tbl ENABLE KEYS; (MyISAM) 或 ANALYZE TABLE (InnoDB)。bulk_insert_buffer_size (MyISAM) / innodb_log_file_size / innodb_buffer_pool_size (InnoDB)。| 錯誤 | 原因 | 對策 |
|---|---|---|
| Duplicate entry for key PRIMARY | 主鍵/唯一鍵衝突 | 用 REPLACE/IGNORE/ON DUPLICATE KEY UPDATE |
| File not found (Errcode: 2) | 路徑錯誤/權限不足 | 用絕對路徑、確認 FILE 權限、LOCAL 關鍵字 |
| Data truncated | 欄位長度/類型不符 | 檢查 CSV 欄位對應、ENCLOSED/ESCAPED 設定 |
| LOAD DATA 卡住 | 長事務/鎖衝突 | 分批導入、關閉唯一檢查、離線導入 |