新聞中心
MySQL導(dǎo)出和導(dǎo)入數(shù)據(jù)
數(shù)據(jù)庫導(dǎo)出可用于將數(shù)據(jù)庫復(fù)制到另一個服務(wù)器??梢詫?shù)據(jù)庫傳輸?shù)皆诹硪慌_主機(jī)上運(yùn)行的服務(wù)器,這是最典型的數(shù)據(jù)導(dǎo)出任務(wù)。也可以將數(shù)據(jù)傳輸?shù)竭\(yùn)行在同一主機(jī)上的不同服務(wù)器。如果正在針對新版本 MySQL 測試服務(wù)器,并且想使用生產(chǎn)服務(wù)器中的實(shí)際數(shù)據(jù),則可以執(zhí)行此操作。還可以將數(shù)據(jù)裝入外部應(yīng)用程序,數(shù)據(jù)導(dǎo)出也可用于將數(shù)據(jù)從一個 RDBMS 傳輸?shù)搅硪粋€ RDBMS 。
在義縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),義縣網(wǎng)站建設(shè)費(fèi)用合理。
完成導(dǎo)出和導(dǎo)入操作的兩種最常用的方法是:
? 使用 SELECT ... INTO OUTFILE 將數(shù)據(jù)導(dǎo)出到文件
? 使用 LOAD DATA INFILE 語句從文件中導(dǎo)入數(shù)據(jù)
1.1. 使用 SELECT...INTO OUTFILE 導(dǎo)出數(shù)據(jù)
可以對 SELECT 語句使用 INTO OUTFILE 子句,將結(jié)果集直接寫入文件。要以這種方式使用 SELECT ,請將 INTO OUTFILE 子句置于 FROM 子句之前。
文件名稱指示輸出文件的位置。 MySQL 會將文件寫入服務(wù)器主機(jī)上的指定路徑。輸出文件具有以下特征:文件將寫入服務(wù)器主機(jī),而不是通過網(wǎng)絡(luò)發(fā)送到客戶機(jī)。文件不能已存在。服務(wù)器將在服務(wù)器主機(jī)上寫入新文件。
要運(yùn)行 SELECT … INTO OUTFILE 語句,必須使用有 FILE 權(quán)限的帳戶連接到服務(wù)器。 MySQL 使用如下權(quán)限創(chuàng)建文件:運(yùn)行 MySQL 進(jìn)程的帳戶將擁有文件、文件對所有用戶可讀。
針對語句所選的每一行,文件中都包含對應(yīng)的一行。默認(rèn)情況下,列值由制表符分隔,而行在換行符處終止。
語法:
SELECT ... INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
[export_options]
export_options:
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
1) 數(shù)據(jù)文件格式說明符
SELECT...INTO OUTFILE 采用默認(rèn)的數(shù)據(jù)文件格式 TSV ,其中列值由制表符分隔,記錄由換行符終止。要使用 SELECT...INTO OUTFILE 寫入使用不同分隔符或終結(jié)符的文件,請使用 FIELDS 和 LINES 子句指定輸出格式。
? FIELDS 子句指定如何顯示列。
l TERMINATED BY 指定字段分隔符,默認(rèn)情況下是制表符。
l ENCLOSED BY 指定如何引住列值。默認(rèn)設(shè)置為不使用引號(即,默認(rèn)值為空字符串)。
l ESCAPED BY 指明當(dāng)表示換行符或制表符之類的非打印字符時要使用的轉(zhuǎn)義符。默認(rèn)轉(zhuǎn)義符是反斜杠 (\) 字符。
? LINES TERMINATED BY 子句指定行分隔符,默認(rèn)情況下是換行符。
MySQL 使用反斜杠來轉(zhuǎn)義特殊字符,所以必須將換行符和制表符之類的字符分別表示為“ \n ”和“ \t ”。同樣,要表示反斜杠字符,則必須將其轉(zhuǎn)義為如下所示:“ \\ ”。
2) 轉(zhuǎn)義字符
命令行終結(jié)符包括換行符和回車 / 換行符對。默認(rèn)的換行符終結(jié)符常見于 Linux 系統(tǒng),而回車 / 換行符對常見于 Windows 系統(tǒng)。
ESCAPED BY
ESCAPED BY 子句僅控制數(shù)據(jù)文件中值的輸出;它不會更改 MySQL 解釋語句中特殊字符的方式。例如,如果通過寫入 ESCAPED BY '@' 指定數(shù)據(jù)文件轉(zhuǎn)義符為“ @ ”,并不表示您必須使用“ @ ”來轉(zhuǎn)義語句中其他的特殊字符。您必須使用 MySQL 的轉(zhuǎn)義符(反斜杠: \ )來轉(zhuǎn)義語句中的特殊字符,使用 LINES TERMINATED BY '\r\n' (而不是 LINES TERMINATED BY '@r@n' )之類的語法。
轉(zhuǎn)義字符含義
\N NULL
\0 NULL (零)字節(jié)
\b 退格
\n 換行
\r 回車
\s 空格
\t 制表符
\ ′ 單引號
\" 雙引號
\\ 反斜杠
以上所有轉(zhuǎn)義字符可以單獨(dú)使用或者在較長的字符串中使用,但 \N 除外,該序列只有在單獨(dú)出現(xiàn)時才用作 NULL 。
3) 用法示例
mysql> select * into outfile 't1.tsv' from t1;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
mysql> show variables like 'secure%';
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
2 rows in set (0.05 sec)
mysql> select * into outfile '/var/lib/mysql-files/t1.tsv' from t1;
Query OK, 7 rows affected (0.01 sec)
注意:如果配置了 secure_file_priv 則必須將導(dǎo)出文件導(dǎo)出到該目錄,否則報錯 ERROR 1290 ;
[root]# cat /var/lib/mysql-files/t1.tsv
100 a
200 a
300 a
mysql> select * into outfile '/var/lib/mysql-files/t1a.tsv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'
-> from t1;
Query OK, 7 rows affected (0.00 sec)
[root]# cat t1a.tsv
100,"a"
200,"a"
300,"a"
[root]#
1.2. 使用 LOAD DATA INFILE 導(dǎo)入數(shù)據(jù)
LOAD DATA INFILE 語句將數(shù)據(jù)文件中的值讀入表。 LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的逆向操作。如果要導(dǎo)入的數(shù)據(jù)文件包含使用制表符或逗號分隔的表數(shù)據(jù),請使用 LOAD DATA INFILE 命令。此類文件最重要的特征是:
n 列值分隔符
n 行分隔符
n 用于引住值的字符(例如:引號)
n 文件中是否指定了列名
n 導(dǎo)入前是否有標(biāo)頭指示要跳過的表行
n 文件在文件系統(tǒng)中的位置
n 訪問文件是否需要有相應(yīng)權(quán)限
n 列的順序
n 文件和表中的列數(shù)是否匹配
語法:
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 '/tmp/City.txt' FIELDS TERMINATED BY ',' INTO TABLE City;
1) 跳過或轉(zhuǎn)換輸入數(shù)據(jù)
? 忽略數(shù)據(jù)文件行
要忽略數(shù)據(jù)文件的開始部分,可以使用 IGNORE n LINES 子句,其中, n 是一個整數(shù),表示要忽略的輸入行數(shù)。當(dāng)文件以列名行(而不是數(shù)據(jù)值行)開始時,請使用此子句。
mysql> LOAD DATA INFILE '/tmp/City.txt'
-> INTO TABLE City IGNORE 2 LINES;
? 忽略或轉(zhuǎn)換列值
您可在列列表和可選的 SET 子句中提供用戶變量,該子句的語法類似于 UPDATE 語句中的 SET 子句。在將從文件中讀取的數(shù)據(jù)值插入表中之前, LOAD DATA INFILE 將對其進(jìn)行轉(zhuǎn)換,處理用戶變量中所包含的值。要將輸入數(shù)據(jù)列分配給用戶變量而不是表列,請以列列表的形式提供用戶變量的名稱。如果將列分配給 SET 表達(dá)式中未使用的用戶變量,則語句將忽略該列中的值,不會將其插入表中。
LOAD DATA INFILE '/tmp/City.txt'
INTO TABLE City ( @skip, @Name,CountryCode, @District, Population)
SET name=CONCAT(@Name,' ',@District);
在語句列的列表中指定用戶變量(而不是列名稱),通過使用 SET 子句(可選)轉(zhuǎn)換列值,該語句將忽略 SET 表達(dá)式中未使用的變量的值。
2) 重復(fù)記錄
使用 INSERT 或 REPLACE 語句向表添加新行時,可以控制語句對包含表中已有鍵的行的處理方法??梢栽试S語句生成錯誤,可以使用 IGNORE 子句放棄該行,也可以使用 ON DUPLICATE KEY UPDATE 子句修改現(xiàn)有的行。
LOAD DATA INFILE 提供了對重復(fù)行的相同級別控制,即通過使用兩個修飾符關(guān)鍵字 IGNORE (放棄包含重復(fù)鍵的行)和 REPLACE (替換為文件中包含相同鍵的版本);但是,其重復(fù)項(xiàng)處理行為根據(jù)數(shù)據(jù)文件是位于服務(wù)器主機(jī)上還是位于客戶機(jī)主機(jī)上而稍有不同,所以使用 LOAD DATA INFILE 時,必須考慮數(shù)據(jù)文件的位置。
3) 從服務(wù)器主機(jī)裝入文件
裝入位于服務(wù)器主機(jī)上的文件時, LOAD DATA INFILE 對包含重復(fù)唯一鍵的行的處理方法如下:
? 默認(rèn)情況下,輸入記錄造成重復(fù)鍵違規(guī)將產(chǎn)生一個錯誤;不會裝入數(shù)據(jù)文件的剩余部分。該點(diǎn)之前的已處理記錄將被裝入表中。
? 如果在文件名后提供 IGNORE 關(guān)鍵字,將忽略造成重復(fù)鍵違規(guī)的新記錄,并且語句不會生成錯誤。 LOAD DATA INFILE 將處理整個文件,裝入所有不包含重復(fù)鍵的記錄,并放棄剩余記錄。
? 如果在文件名后提供 REPLACE 關(guān)鍵字,造成重復(fù)鍵違規(guī)的新記錄將替換表中現(xiàn)存的包含重復(fù)鍵值的任何記錄。 LOAD DATA INFILE 將處理整個文件,將文件中的所有記錄裝入表中。
4) 從客戶機(jī)主機(jī)裝入文件
從客戶機(jī)主機(jī)裝入文件時,默認(rèn)情況下 LOAD DATA INFILE 將忽略包含重復(fù)鍵的記錄。即,默認(rèn)行為與指定 IGNORE 選項(xiàng)時相同。這是因?yàn)榭蛻魴C(jī) / 服務(wù)器協(xié)議不允許在傳輸開始后中斷從客戶機(jī)主機(jī)到服務(wù)器的數(shù)據(jù)文件傳輸,因此不方便在操作過程中中止操作。
5) 用法示例
mysql>use test
mysql> CREATE TABLE `t1` (
-> `f1` int(11) DEFAULT NULL,
-> `f2` varchar(20) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1
-> /*!50100 PARTITION BY HASH (f1)
-> PARTITIONS 4 */ ;
Query OK, 0 rows affected (0.17 sec)
導(dǎo)入默認(rèn)格式 t1.tsv 文件
mysql> LOAD DATA local INFILE '/var/lib/mysql-files/t1.tsv' IGNORE INTO TABLE t1;
Query OK, 7 rows affected (0.01 sec)
Records: 7 Deleted: 0 Skipped: 0 Warnings: 0
mysql>
mysql>
mysql> select * from t1;
+------+------+
| f1 | f2 |
+------+------+
| 100 | a |
| 200 | a |
| 300 | a |
| 400 | a |
| 1 | a |
| 101 | a |
| 111 | b |
+------+------+
7 rows in set (0.00 sec)
導(dǎo)入指定格式 t1.tsv 文件
mysql> LOAD DATA local INFILE '/var/lib/mysql-files/t1a.tsv' IGNORE INTO TABLE t1
-> FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ignore 1 lines ;
Query OK, 6 rows affected (0.00 sec)
Records: 6 Deleted: 0 Skipped: 0 Warnings: 0
mysql>
示例:
LOAD DATA local INFILE '/Users/xxx/Downloads/loaddata.txt' IGNORE INTO TABLE testLoadData
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' ignore 1 lines (username, age, description);
本文標(biāo)題:MySQL入門--導(dǎo)出和導(dǎo)入數(shù)據(jù)
文章出自:http://fisionsoft.com.cn/article/pdsips.html