如果有大量的外部資料要匯入,一個一個 insert 肯定很累
就算寫成 SQL 腳本也不是很方便
而且有時候資料的提供者是客戶或不懂程式的人
總不能叫他們學 SQL 吧
最容易的做法就是萬能 Excel
我們可以提供範本 CSV 檔案給客戶
他們所見即所得照著輸入
甚至是他們原本就在使用的 Excel 直接複製過來
正確又快速
取得檔案後就能輕鬆導入(import)資料庫了
語法
LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]
範例:
LOAD DATA INFILE 'C:/data.csv'
INTO TABLE user
fields terminated BY ','
lines terminated BY '\n'
(id, name, @email)
;
疑難排解
ERROR 3948
報錯
ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides
原因
解決
一、開啟設定
載入文件設置
show variables like 'local_infile';
開啟設置
SET GLOBAL local_infile=on;
二、若不成功則要登入時設定
SET GLOBAL local_infile=1;
quit;
mysql --local-infile=1 -u root -p
row 1 doesn’t contain data for all columns
原因
欄位資料不夠
例如你有三個欄位:id, name, email
擷取一行只找到兩個欄位的值
就會報這個錯誤
如果明明有給到三個欄位的值
卻仍然出現這個錯誤
通常就是 parsing 出錯
造成資料庫擷取的值不一致
應檢查 STARTING、TERMINATED、ENCLOSED、ESCAPED 相關設定