MySQL lOAD DATA詳解


load data
參考文檔:
https://dev.mysql.com/doc/refman/8.0/en/load-data.html

 

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}] ...]


這一堆參數還不少。

 

LOCAL:是否導入本地電腦文本文件,
導入本地電腦文件:一定要啟用 local_infile 參數,否則會報錯。
導入非本地電腦文件:用戶一定要 FILE 權限,secure_file_priv參數值如果不為空,則文件一定要在這個目錄中,如果為空,則該文件只需服務器可讀。

小插曲,我本地使用mysql8.0。23客戶端,在一切條件符合的情況下,LOAD DATA數據報錯.
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 ;
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
排錯一圈,才發現踩了mysql8的一個bug,
https://bugs.mysql.com/bug.php?id=91872
解決方法:
在client端配置文件中加入
[client]
loose-local-infile = 1
或者在使用mysql命令行時,指定 loose-local-infile = 1 連接數據庫
mysql --local-infile=1 -uroot -p123456 -P3306 -h1.1.1.1

 

 

[REPLACE | IGNORE]:如遇到唯一沖突重復處理機制
REPLACE:覆蓋寫。
IGNORE:忽略。
如果沒有指定REPLACE, IGNORE或者LOCAL,當發生錯誤時,會報錯,並且文本余下部分不會被執行。

示例:
mysql> load data infile '/root/1.csv' into table ceshi.t1 ;
ERROR 1265 (01000): Data truncated for column 'id' at row 2

提示:如果要在加載數據中忽略外鍵約束,需要在Load data 數據之前執行SET foreign_key_checks = 0

 


如果沒有指定 FIELDS 或 LINES 子句,則默認值如下
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
提示:在 WINDOWS 系統中,想要正確的讀文件需要配置 LINES TERMINATED BY '\r\n',因為WINDOWS系統通常使用兩個字符做為終止符。

CHARACTER SET charset_name
設置導入內容的字符集,默認采用character_set_database系統變量值字符集導入內容。
提示:
這里我踩了一個坑,我本地使用CRT連接數據庫,不知為何客戶端字符集是latain1了,文本中包含中文,如果以默認方式導入會出現亂碼。一般情況下,不需要指定CHARACTER SET

示例:
root# cat 1.csv
1,chai
2,測試

mysql> show variables like '%character%'
-> ;
+--------------------------+------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql57/share/charsets/ |
+--------------------------+------------------------------------+
8 rows in set (0.07 sec)

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\';
Query OK, 2 rows affected (0.15 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | chai |
| 2 | ?? |
+----+------+
2 rows in set (0.06 sec)

set names utf8;
再查詢就正常了
mysql> select * from t1;
+----+----------------+
| id | name |
+----+----------------+
| 1 | chai |
| 2 | 測試 |

 


FIELDS TERMINATED BY:指定兩列之間分隔符,默認是\t ,也就是跳格,但大多時候生成的文本文件都是','逗號,所以在導入數據時,需要顯式指定。

示例:
root# cat 1.csv
1,chai
2,測試

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',';
Query OK, 2 rows affected (0.20 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+--------+
| id | name |
+----+--------+
| 1 | chai |
| 2 | 測試 |
+----+--------+
2 rows in set (0.09 sec)

 

 


ENCLOSED BY:去掉字符串中包裹的符號

示例:

root #cat 1.csv
1,chai
2,測試
3,""chayicha"
4,"chayige"

如果以之前的參數導入,則結果如下,里邊的引號也會寫入進去。

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',';
Query OK, 4 rows affected (0.16 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | chai |
| 2 | 測試 |
| 3 | ""chayicha" |
| 4 | "chayige" |
+----+-------------+
4 rows in set (0.05 sec)


##加入 ENCLOSED BY '"' 參數后,在導入時字符左右兩則的雙引號被刪掉了。

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Query OK, 4 rows affected (0.13 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+-----------+
| id | name |
+----+-----------+
| 1 | chai |
| 2 | 測試 |
| 3 | "chayicha |
| 4 | chayige |
+----+-----------+

 


ESCAPED BY:設置轉義字符,默認為\ 。

示例:
root#cat 1.csv
1,chai
2,測試
3,"\tchayicha"
4,wo\\a\\b\\c\tchayige

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\';
Query OK, 4 rows affected (0.13 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+------------------+
| id | name |
+----+------------------+
| 1 | chai |
| 2 | 測試 |
| 3 | chayicha |
| 4 | wo\a\b\c chayige |
+----+------------------+

 

 


LINES STARTING BY:忽略一個公共前綴,如示例,只有以 cha 開頭的記錄正確寫入到了數據庫,這個參數應該不常用

示例:
root#cat 1.csv
cha1,chai
2,測試
cha3,"yicha"
4,chayige

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES STARTING BY 'cha';
Query OK, 3 rows affected, 2 warnings (0.14 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 2

mysql> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | chai |
| 3 | yicha |
| 0 | NULL |
+----+-------+

 

 

LINES TERMINATED BY 'string':分行符,一般情況下遇到回行即分行 (\r\n)

示例:
演示一次遇到句號(。)即換行符
root#cat 2.csv
a,chai。2,測試。3,chayicha。

mysql> load data local infile '/Users/2.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '';
Query OK, 4 rows affected, 4 warnings (0.15 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 4

mysql> select * from t1;
+----+----------+
| id | name |
+----+----------+
| 0 | chai |
| 2 | 測試 |
| 3 | chayicha |
| 0 | NULL |
+----+----------+
4 rows in set (0.07 sec)

 


IGNORE number {LINES | ROWS}:跳過開始的多少行才進行導入,如果文本中有字段名,可以跳過第一行.

示例:
root# cat 1.csv
1,chai
2,測試
3,"yicha"
4,chayige

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
1 LINES;
Query OK, 3 rows affected (0.13 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+---------+
| id | name |
+----+---------+
| 2 | 測試 |
| 3 | yicha |
| 4 | chayige |
+----+---------+

 

 

[(col_name_or_user_var [, col_name_or_user_var] ...)]:手動指定要插入的列

示例:
root# cat 1.csv
1,chai
2,測試
3,"yicha"
4,chayige

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
1 LINES(id,name);
Query OK, 3 rows affected (0.16 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 2 | 測試 | NULL |
| 3 | yicha | NULL |
| 4 | chayige | NULL |
+----+---------+------+
3 rows in set (0.09 sec)

 


[SET col_name={expr | DEFAULT} [, col_name={expr | DEFAULT}] ...]:在加載數據時做一些計算或更新一些其它字段值。

示例:
root# cat 1.csv
1,chai
2,測試
3,"yicha"
4,chayige

#在寫入數據時,更新age字段列
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
-> 1 LINES(id,name) set age=10;
Query OK, 3 rows affected (0.13 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 2 | 測試 | 10 |
| 3 | yicha | 10 |
| 4 | chayige | 10 |
+----+---------+------+
3 rows in set (0.07 sec)

#在寫入數據時對數據做二次邏輯處理
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
-> 1 LINES(id,@name) set name=concat(@name,1);
Query OK, 3 rows affected (0.14 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql> select * from t1;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 2 | 測試1 | NULL |
| 3 | yicha1 | NULL |
| 4 | chayige1 | NULL |
+----+----------+------+
3 rows in set (0.07 sec)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM