`
kevin850115
  • 浏览: 65941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Load Data使用方法

阅读更多
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]]
    [LINES TERMINATED BY '\n']
    [IGNORE number LINES]
    [(col_name,...)] 
LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中。如果指定LOCAL关键词,从客户主机读文件。如果LOCAL没指定,文件必须位于服务器上。(LOCAL在MySQL3.22.6或以后版本中可用。)

为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。另外,为了对服务器上文件使用LOAD DATA INFILE,在服务器主机上你必须有file的权限。见6.5 由MySQL提供的权限。

如果你指定关键词LOW_PRIORITY,LOAD DATA语句的执行被推迟到没有其他客户读取表后。

使用LOCAL将比让服务器直接存取文件慢些,因为文件的内容必须从客户主机传送到服务器主机。在另一方面,你不需要file权限装载本地文件。

你也可以使用mysqlimport实用程序装载数据文件;它由发送一个LOAD DATA INFILE命令到服务器来运作。 --local选项使得mysqlimport从客户主机上读取数据。如果客户和服务器支持压缩协议,你能指定--compress在较慢的网络上获得更好的性能。

当在服务器主机上寻找文件时,服务器使用下列规则:

如果给出一个绝对路径名,服务器使用该路径名。 
如果给出一个有一个或多个前置部件的相对路径名,服务器相对服务器的数据目录搜索文件。 
如果给出一个没有前置部件的一个文件名,服务器在当前数据库的数据库目录寻找文件。 
注意这些规则意味着一个像“./myfile.txt”给出的文件是从服务器的数据目录读取,而作为“myfile.txt”给出的一个文件是从当前数据库的数据库目录下读取。也要注意,对于下列哪些语句,对db1文件从数据库目录读取,而不是db2:

mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;

REPLACE和IGNORE关键词控制对现有的唯一键记录的重复的处理。如果你指定REPLACE,新行将代替有相同的唯一键值的现有行。如果你指定IGNORE,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键键时,出现一个错误,并且文本文件的余下部分被忽略时。

如果你使用LOCAL关键词从一个本地文件装载数据,服务器没有办法在操作的当中停止文件的传输,因此缺省的行为好像IGNORE被指定一样。

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,
SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。两个命令的FIELDS和LINES子句的语法是相同的。两个子句是可选的,但是如果指定两个,FIELDS必须在LINES之前。

如果你指定一个FIELDS子句,它的每一个子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可选的,除了你必须至少指定他们之一。

如果你不指定一个FIELDS子句,缺省值与如果你这样写的相同:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'

如果你不指定一个LINES子句,缺省值与如果你这样写的相同:

LINES TERMINATED BY '\n' 
换句话说,缺省值导致读取输入时,LOAD DATA INFILE表现如下:

在换行符处寻找行边界 
在定位符处将行分进字段 
不要期望字段由任何引号字符封装 
将由“\”开头的定位符、换行符或“\”解释是字段值的部分字面字符 
相反,缺省值导致在写入输出时,SELECT ... INTO OUTFILE表现如下:

在字段之间写定位符 
不用任何引号字符封装字段 
使用“\”转义出现在字段中的定位符、换行符或“\”字符 
在行尾处写换行符 
注意,为了写入FIELDS ESCAPED BY '\\',对作为一条单个的反斜线被读取的值,你必须指定2条反斜线值。

IGNORE number LINES选项可被用来忽略在文件开始的一个列名字的头:

mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;

当你与LOAD DATA INFILE一起使用SELECT ... INTO OUTFILE将一个数据库的数据写进一个文件并且随后马上将文件读回数据库时,两个命令的字段和处理选项必须匹配,否则,LOAD DATA INFILE将不能正确解释文件的内容。假定你使用SELECT ... INTO OUTFILE将由逗号分隔的字段写入一个文件:

mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'
           FIELDS TERMINATED BY ','
           FROM ...

为了将由逗号分隔的文件读回来,正确的语句将是:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY ',';

相反,如果你试图用下面显示的语句读取文件,它不会工作,因为它命令LOAD DATA INFILE在字段之间寻找定位符:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
           FIELDS TERMINATED BY '\t';

可能的结果是每个输入行将被解释为单个的字段。

LOAD DATA INFILE能被用来读取从外部来源获得的文件。例如,以dBASE格式的文件将有由逗号分隔并用双引号包围的字段。如果文件中的行由换行符终止,下面显示的命令说明你将用来装载文件的字段和行处理选项:

mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
           FIELDS TERMINATED BY ',' ENCLOSED BY '"'
           LINES TERMINATED BY '\n';

任何字段或行处理选项可以指定一个空字符串('')。如果不是空,FIELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必须是一个单个字符。FIELDS TERMINATED BY和LINES TERMINATED BY值可以是超过一个字符。例如,写入由回车换行符对(CR+LF)终止的行,或读取包含这样行的一个文件,指定一个LINES TERMINATED BY '\r\n'子句。

FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包围字符。对于输出(SELECT ... INTO OUTFILE),如果你省略OPTIONALLY,所有的字段由ENCLOSED BY字符包围。对于这样的输出的一个例子(使用一个逗号作为字段分隔符)显示在下面:

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"

如果你指定OPTIONALLY,ENCLOSED BY字符仅被用于包围CHAR和VARCHAR字段:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20

注意,一个字段值中的ENCLOSED BY字符的出现通过用ESCAPED BY字符作为其前缀来转义。也要注意,如果你指定一个空ESCAPED BY值,可能产生不能被LOAD DATA INFILE正确读出的输出。例如,如果转义字符为空,上面显示的输出显示如下。注意到在第四行的第二个字段包含跟随引号的一个逗号,它(错误地)好象要终止字段:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20

对于输入,ENCLOSED BY字符如果存在,它从字段值的尾部被剥去。(不管是否指定OPTIONALLY都是这样;OPTIONALLY对于输入解释不起作用)由ENCLOSED BY字符领先的ESCAPED BY字符出现被解释为当前字段值的一部分。另外,出现在字段中重复的ENCLOSED BY被解释为单个ENCLOSED BY字符,如果字段本身以该字符开始。例如,如果ENCLOSED BY '"'被指定,引号如下处理:

"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss      -> The "BIG" boss
The ""BIG"" boss    -> The ""BIG"" boss

FIELDS ESCAPED BY控制如何写入或读出特殊字符。如果FIELDS ESCAPED BY字符不是空的,它被用于前缀在输出上的下列字符:

FIELDS ESCAPED BY字符 
FIELDS [OPTIONALLY] ENCLOSED BY字符 
FIELDS TERMINATED BY和LINES TERMINATED BY值的第一个字符 
ASCII 0(实际上将后续转义字符写成 ASCII'0',而不是一个零值字节) 
如果FIELDS ESCAPED BY字符是空的,没有字符被转义。指定一个空转义字符可能不是一个好主意,特别是如果在你数据中的字段值包含刚才给出的表中的任何字符。

对于输入,如果FIELDS ESCAPED BY字符不是空的,该字符的出现被剥去并且后续字符在字面上作为字段值的一个部分。例外是一个转义的“0”或“N”(即,\0或\N,如果转义字符是“\”)。这些序列被解释为ASCII 0(一个零值字节)和NULL。见下面关于NULL处理的规则。

对于更多关于“\”- 转义句法的信息,在某些情况下,字段和行处理选项相互作用:

如果LINES TERMINATED BY是一个空字符串并且FIELDS TERMINATED BY是非空的,行也用FIELDS TERMINATED BY终止。 
如果FIELDS TERMINATED BY和FIELDS ENCLOSED BY值都是空的(''),一个固定行(非限定的)格式被使用。用固定行格式,在字段之间不使用分隔符。相反,列值只用列的“显示”宽度被写入和读出。例如,如果列被声明为INT(7),列的值使用7个字符的字段被写入。对于输入,列值通过读取7个字符获得。固定行格式也影响NULL值的处理;见下面。注意如果你正在使用一个多字节字符集,固定长度格式将不工作。 
NULL值的处理有多种,取决于你使用的FIELDS和LINES选项:

对于缺省FIELDS和LINES值,对输出,NULL被写成\N,对输入,\N被作为NULL读入(假定ESCAPED BY字符是“\”)。 
如果FIELDS ENCLOSED BY不是空的,包含以文字词的NULL作为它的值的字段作为一个NULL值被读入(这不同于包围在FIELDS ENCLOSED BY字符中的字NULL,它作为字符串'NULL'读入)。 
如果FIELDS ESCAPED BY是空的,NULL作为字NULL被写入。 
用固定行格式(它发生在FIELDS TERMINATED BY和FIELDS ENCLOSED BY都是空的时候),NULL作为一个空字符串被写入。注意,在写入文件时,这导致NULL和空字符串在表中不能区分,因为他们都作为空字符串被写入。如果在读回文件时需要能区分这两者,你应该不使用固定行格式。 
一些不被LOAD DATA INFILE支持的情况:

固定长度的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY都为空)和BLOB或TEXT列。 
如果你指定一个分隔符与另一个相同,或是另一个的前缀,LOAD DATA INFILE不能正确地解释输入。例如,下列FIELDS子句将导致问题: 
FIELDS TERMINATED BY '"' ENCLOSED BY '"'

如果FIELDS ESCAPED BY是空的,一个包含跟随FIELDS TERMINATED BY值之后的FIELDS ENCLOSED BY或LINES TERMINATED BY的字段值将使得LOAD DATA INFILE过早地终止读取一个字段或行。这是因为LOAD DATA INFILE不能正确地决定字段或行值在哪儿结束。 
下列例子装载所有persondata表的行:

mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;

没有指定字段表,所以LOAD DATA INFILE期望输入行对每个表列包含一个字段。使用缺省FIELDS和LINES值。

如果你希望仅仅装载一张表的某些列,指定一个字段表:

mysql> LOAD DATA INFILE 'persondata.txt'
           INTO TABLE persondata (col1,col2,...);

如果在输入文件中的字段顺序不同于表中列的顺序,你也必须指定一个字段表。否则,MySQL不能知道如何匹配输入字段和表中的列。

如果一个行有很少的字段,对于不存在输入字段的列被设置为缺省值。

如果字段值缺省,空字段值有不同的解释:

对于字符串类型,列被设置为空字符串。 
对于数字类型,列被设置为0。 
对于日期和时间类型,列被设置为该类型的适当“零”值。 
如果列有一个NULL,或(只对第一个TIMESTAMP列)在指定一个字段表时,如果TIMESTAMP列从字段表省掉,TIMESTAMP列只被设置为当前的日期和时间。

如果输入行有太多的字段,多余的字段被忽略并且警告数字加1。

LOAD DATA INFILE认为所有的输入是字符串,因此你不能像你能用INSERT语句的ENUM或SET列的方式使用数字值。所有的ENUM和SET值必须作为字符串被指定!

如果你正在使用C API,当LOAD DATA INFILE查询完成时,你可通过调用API函数mysql_info()得到有关查询的信息。信息字符串的格式显示在下面:

Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
当值通过INSERT语句插入时,在某些情况下出现警告,除了在输入行中有太少或太多的字段时,LOAD DATA INFILE也产生警告。警告没被存储在任何地方;警告数字仅能用于表明一切是否顺利。如果你得到警告并且想要确切知道你为什么得到他们,一个方法是使用SELECT ... INTO OUTFILE到另外一个文件并且把它与你的原版输入文件比较。
分享到:
评论

相关推荐

    MySQL里load data遇到的问题及解决方法

    但是,在使用 load data 时,可能会遇到一些问题,本文将讨论这些问题和解决方法。 问题描述: 在使用 load data 加载文件时,可能会出现加载完毕后,信息不是正常、正规的格式。这是因为,在某些情况下,load data...

    dataload程序及使用说明

    **dataload程序详解** `dataload` 是一个高效的数据录入工具,主要针对Oracle数据库系统设计,但同样适用于其他类型的数据库。...了解并熟练掌握`dataload` 的使用,能够极大地提升数据库管理工作的质量和效率。

    Dataload软件使用说明

    本文将深入解析Dataload的安装、工作原理、使用方法以及操作流程,帮助用户更好地理解和运用这款软件。 一、Dataload的安装 Dataload的安装过程简洁明了,只需将应用程序和相关文件复制到客户端机器的指定文件夹下...

    ABB 机器人LoadData使用说明.pdf

    ABB机器人LoadData使用说明详细指南: LoadData是ABB机器人编程中的一个基本概念和操作,它涉及到为机器人建立负载数据,这通常包括负载的质量、质心位置以及惯性矩。此操作对于确保机器人进行精确和安全的操作至关...

    oracle sqlload loaddata.ctl 使用例子

    在这个"oracle sqlload loaddata.ctl 使用例子"中,我们将深入探讨如何利用SQL*Loader将文本文件(如"data.txt")中的数据高效地加载到Oracle数据库中。 首先,`loaddata.ctl`是SQL*Loader的数据装载控制文件,它是...

    loadData批量导入以及压缩协议使用指南1

    MySQL的`LOAD DATA INFILE`语句是一种高效的数据批量导入方法,它的性能通常是单条`INSERT`语句的几十倍,特别适用于大数据量的导入。从Mycat 1.4版本开始,它开始支持MySQL的压缩协议,这对于处理大量数据和大结果...

    dataload应用手册

    "dataload应用手册" dataload应用手册作为一个快速实施工具,在整个实施过程当中,静态数据录入会占用大量的时间,该手册旨在...在使用dataload 工具时,用户需要了解这些命令的使用方法,以便更好地完成数据的导入。

    DataLoad导入数据快速入门[整理].pdf

    "DataLoad导入数据快速入门" DataLoad是Oracle E-Business Suite(EBS)中的一个数据导入工具...通过本文档,我们可以了解DataLoad的基本概念、实现方法和操作步骤,从而更好地使用DataLoad实现数据的快速导入和同步。

    DataLoad操作命令集合

    整理出了dataload导入过程中键盘操作的命令集合,很方便,很实用。

    Dataload_WCS

    - **应用场景**:这些示例展示了如何使用 dataload 加载不同类型的数据,包括目录和目录相关的组件(如目录组、目录条目、商品等)。 #### 中介器 (Mediators) - **中介器的作用**:中介器在数据加载过程中起到关键...

    DataLoad详细教材

    DataLoad详细教材DataLoad详细教材

    load_data_loaddatapython_加载数据程序_pythonload_data_源码

    在使用`load_data.py`时,确保遵循`README.md`中的指导。这可能包括安装依赖库、设置正确的文件路径以及理解任何特定的输入或输出格式。同时,`recommendation`文件可能提供了一个数据集的例子,展示了如何使用这个...

    DATALOAD CLASSIC V5.2.1.0

    DataLoad是一个针对Oracle开发的数据录入工具(也适用其他程序),其工作原理是模仿键盘的操作,将数据和键盘的按键以表格的形式存储起来。当你需要在目标程序界面中输入数据的时候,dataload根据所定义的数据和键盘...

    DataLoad v4.2gziolHH.

    在这个场景中,我们讨论的是DataLoad的v4.2版本,文件名标识为"DataLoad v4.2gziolHH",并且提供了对应的zip压缩包,表明这是一款无需安装即可使用的便携式版本。 1. **DataLoad的概述**: - 数据加载:DataLoad的...

    mysql load data infile 的用法.docx

    Mysql Load Data Infile 的用法 Mysql 的 Load Data Infile 语句是一个非常强大的工具,可以快速地将文本文件中的数据导入到 Mysql 数据库中。在本文中,我们将详细介绍 Load Data Infile 的用法,包括其语法、参数...

    dataload命令全集

    dataload命令全集

    DATALOAD导入模版.rar

    "DATALOAD导入模版"很可能是一个具体的操作指南或示例文件,它详细说明了如何使用DATALOAD工具将数据加载到数据库中。这个模板可能包括数据格式要求、字段映射、数据验证规则以及导入过程的步骤,帮助用户正确地准备...

    DATALOAD 最新版本5.4

    DATALOAD是一款在Oracle电子商务套件(E-Business Suite,简称EBS)中广泛使用的数据加载工具,其最新版本5.4.1.0在2010年12月20日发布,为用户带来了更为高效、便捷的数据处理体验。本文将深入探讨这个免费版本的...

    中文版DataLoad导入导出工具

    5. **用户友好界面**:考虑到中国用户的使用习惯,DataLoad采用中文界面,使得操作更加直观易懂,降低了使用门槛。 二、DataLoad的适用场景: 1. **数据库迁移**:在数据库升级、系统更换或者数据库环境调整时,...

Global site tag (gtag.js) - Google Analytics