文章目錄
本打算用navicat for mysql(version10.0.11)直接導出csv文件,但發現‘導出數據’對話框中並無’.csv’選項,只好選擇命令語句導出csv,但在這個過程中遇到了一些問題,特作此記錄。
導出csv文件
導出數據到csv基本語句
SELECT * FROM 表名
INTO OUTFILE '導出目錄及文件名'
FIELDS TERMINATED BY ',' #字段間以,號分隔
OPTIONALLY ENCLOSED BY '"' #字段用"號括起
ESCAPED BY '"' #字段中使用的轉義符爲"
LINES TERMINATED BY '\r\n'; #行以\r\n結束
"secure-file-priv"錯誤原因及解決方法
secure_file_priv參數用於限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()傳到哪個指定目錄。
在我運行上述導出語句後,提示ERROR:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
經查詢,錯誤原因是在安裝MySQL的時候限制了導入與導出的目錄權限。
我們可以通過show variables like '%secure%';
命令查看‘secure-file-priv’ 當前的值是什麼。
- secure_file_priv 爲 NULL 時,表示限制mysqld不允許導入或導出
- secure_file_priv 爲 /tmp時,表示限制mysqld只能在/tmp目錄中執行導入導出,其他目錄不能執行
- secure_file_priv 沒有值時,表示不限制mysqld在任意目錄的導入導出
可以看到,我的secure_file_priv 爲 NULL,表示限制不能導入導出。爲了改變MySQL的導入導出權限,需要打開my.cnf 或 my.ini(一般在MySQL安裝路徑主目錄下),加入以下語句,重啓MySQL即可。
secure_file_priv='' #不限制MySQL在任意目錄的導入導出
MySQL的重啓
MySQL的重啓不是關閉cmd或navicat在打開就好,必須依次執行以下命令才能夠重啓:
net stop mysql #關閉mysql服務
net start mysql #打開mysql服務
mysql導出目錄的進一步說明
重新執行下圖的導出csv命令後,沒有報錯,說明文件導出成功,但是在桌面我卻沒有看到‘person.csv’文件,最終在C盤的根目錄下發現‘UsersAdministratorDesktopperson.csv’文件,說明程序將‘Users\Administrator\Desktop\person.csv’整個視爲文件名。然後我將語句中的目錄路徑中的‘\’換爲’/’,成功在桌面導出‘person.csv’文件。可對比下面兩張圖。
因此,在導出數據過程中,導出目錄需要使用斜槓‘/’而非反斜槓‘\’。此外還可以直接輸出INTO OUTFILE '\文件名'
,這是文件直接輸出到該數據庫目錄下,即’\MySQL安裝目錄\data\數據庫名\文件名’。
導入csv數據
導入數據基本LOAD DATA 語法
LOAD DATA INFILE '導入目錄及文件名'
INTO TABLE 表名
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
Duplicate entry ‘1’ for key 'PRIMARY’錯誤及解決方法
如上圖所示,在向person表中導入數據時,提示出錯“Duplicate entry ‘1′ for key ‘PRIMARY’ ”,錯誤原因是在一張數據表中是不能同時出現多個相同主鍵的數據。解決方法有:
- IGNORE
load data infile "目錄及文件" ignore into table 表名;
- REPLACE
load data infile "目錄及文件" replace into table 表名;
replace和ignore關鍵詞控制對現有的唯一鍵記錄的重複的處理。如果你指定replace,新行將代替有相同的唯一鍵值的現有行。如果你指定ignore,跳過有唯一鍵的現有行的重複行的輸入。如果你不指定任何一個選項,當找到重複鍵時,出現一個錯誤,並且文本文件的餘下部分被忽略。
在網上找了好久解決方法,但大多數時INSERT插入數據時的解決方法,在這裏分享一篇LOAD導入數據的文章:mysql導入數據load data infile用法
我分別試驗了IGNORE與REPLACE關鍵字,下面兩張對比可以看到,IGNORE受影響的行數爲0;而REPLACE受影響的行爲3。