导入和导出
15.1 導入和導出操作
MYSQL有兩種SQL語句來用來導入數據從文件中到數據庫或導出數據從數據庫中到文件:
? ?1.LOAD DATA INFILE 讀取數據記錄從文件中和插入他們到一個表中
? ?2.select 。。。into OUTFILE 寫一個select操作的結果到一個文件中
命令行有mysqlimport和mysqldump
15.2 導入和導出使用SQL
15.2.1 導入數據load data infile
?load data infile讀取值從一個單獨數據文件。
load data infile ‘file_name’ into table table_name;
load data infile 'C:/mydata/data.txt' into table t;
load data [Local] infile 'file_name'
? ? [IGNORE|REPLACE]
? ?into table table_name
? ?format_specifiers
? ?[IGNORE n ?LINES]
? ?[(column_list)]
? [set (assignment_list)]
15.2.1.1 指定數據文件位置
默認情況下,MYSQL任務文件位于服務器中。MYSQL服務器直接讀取文件
2.語句開始load data local infile 而不是load data infile,文件被讀取從客戶端。local意味著local對于客戶端。
如果指定了先對路徑就會從數據庫的目錄中尋找。
如果使用loacl來讀取數據文件在客戶端,路徑名字翻譯:
? ?1.如果你引用文件通過它的全路徑名,客戶端在exact loaction?
? ? 2.如果你指定了相對路徑名,客戶端程序尋找相對文件到它目前目錄。
? ? LOAD DATA ?LOCAL INFILE ? ‘/var/tmp/data.tx’ ?into table t;
? ? LOAD ?DATA LOCAL INFILE 'data.txt' into table t;
15.2.1.2 跳過數據文件行
load data infile '/tmp/data.txt' into table t ignore 1 lines;
15.2.1.3 跳過自動標的列
默認情況下,數據文件行的排列順序和表的排列順序是一直的
列舉一些列在下面的兩種方式:
load data infile '/tmp/people.txt' into table subscriber (name,address);
順序不同時采用 load data infile '/tmp/people.txt' into table subscriber (address,name);
15.2.1.4 skipping or transforming column values
跳過和轉換列值
load data infile '/tmp/people2.txt' into table subscriber (@skip ,@firest,@last,address) set name= Concat(@first,' ',@last);
15.2.1.5 load data infile 和重復的記錄
當數據文件在服務器端是處理,重復的記錄如下:
1.輸入記錄引發一個重復鍵值沖突導致一個錯誤和剩下的數據文件沒有被加載。處理的記錄到點被加載進表
2.如果你指定了IGNORE關鍵字,新記錄引發重復鍵值沖突被忽略和沒有錯誤發生。load data infile處理整個文件,加載所有沒有包含重復鍵值和拋棄剩下的
3.如果你指定了replace鍵值在文件名后,新的九樓引發重復鍵值沖突替代任何已經存在的表中的記錄。
IGNORE和REPLACE都是排他性的。
15.2.1.6 由LOAD DATA INFILE提供的信息
15.2.1.7 對于LOAD DATA INFILE需要的特權
需要INSRT特權,如果指定了replace修飾符需要deltet特權。
15.2.1.8 load data infile的效率
使用load data with load data infile是比使用insert語句更加有效率。
15.2.2 exproting data
select * into outfile 'Country.txt' from country;
1.產生文件在服務器,為了發送到客戶端
2.語句有FILE privilege獲取文件
3.被創建的文件獲取權限擁有MySQL服務器
4.輸出文件每一行都包含一行。
言外之意:
1.如果你直接訪問文件,必須登錄夫妻否
2.文件全局可以讀,任何登錄系統的都可以讀取它。
3.MySQL服務器擁有的文件,可能布包好移除它在你處理它后。需要mysql的管理員來移除它。
15.2.3 數據文件的格式指定
1.0 數據值被認為由tab字符終止
2 數據值被認為沒有引用的。為了
默認的終止符是新行符,為了表明一個行終止,使用lines語句。
LINES TEMMINATED BY ‘\n’
ESCAPED BY :指定分隔符
select * into outfile '/tmp/data-out.txt'
FIELDS TEMINATED BY ',' ENCLOUSED by '"'
LINES TERMINATED BY '\r'
FROM t;
15.2.4 導入和導出NULL值
MYSQL使用\n來表明NULL值
1.如LOAD DATA INFILE,\n表明NULL,MYSQL轉換一個空值為一個空字符,或者0,取決于相應的表列。
2.對于select ...into outfile,mysql寫NULL值到輸出文件\N。
15.3 導入和導出從命令行
mysqlimport options db_name input_file。。。
根據文件名來決定表名,每個表被加載都是已經存在的。--lines-terminated-by=string ? --fields=terminated-by=string
--fields-enclosed-by=char or --fields-optionally-encolose-by=char ?--fields-escaped-by=char
mysqlimport --lines-terminated-by='\r\n" world City.txt
shell> mysqlimport --fields-enclosed-by='"' world City.txt
其他的mysqlimport選項提供可選的控制對于數據文件的加載:
1.--ignore 或者--replace,處理重復的鍵值
2.--local 默認情況被加載的文件在服務器端,--local,mysqlimport讀取數據文件和通過網絡發送到服務器。
15.3.2 導出數據使用mysqldump
為了使用mysqldump來導出表作為tab分隔符的數據文件,指定--tab=dir_name選項。
mysqldump --tab=dir_name options db_name tab_name...
如:mysqldump --tab=/tmp world City
重新導入:cd /tmp ? ? mysql world < city.sql ? ? mysqlimport world City.txt
如果不想生成.sql文件,可以使用--no-create-info選項
這--all-databases和--databases選項對于mysqldump被用來輸出多個數據。
總結
- 上一篇: 子查询
- 下一篇: 16.1 用户变量语法