load的语法
LOAD DATA [ LOW_PRIORITY | CONCURRENT ] [ LOCAL ] INFILE ' file_name.txt ' [ REPLACE | IGNORE ] INTO TABLE tbl_name [ FIELDS [TERMINATED BY 'string' ] [ [OPTIONALLY ] ENCLOSED BY ' char ' ] [ ESCAPED BY 'char' ] ] [ LINES [STARTING BY 'string' ] [ TERMINATED BY 'string' ] ] [ IGNORE number LINES ] [ (col_name_or_user_var,...) ] [ SET col_name = expr,...) ]
LOAD DATA INFILE 语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。
由 character_set_database 系统变量指示的字符集被用于解释文件中的信息。 SET NAMES 和 character_set_client 的设置不会影响对输入的解释。
典型的示例
LOAD DATA LOCAL INFILE ' data.txt ' INTO TABLE tbl_name FIELDS TERMINATED BY ' , ' OPTIONALLY ENCLOSED BY ' " ' LINES TERMINATED BY ' \n '
如果您只想载入一个表的部分列,则应指定一个列清单:
LOAD DATA LOCAL INFILE ' persondata.txt ' INTO TABLE persondata (col1,col2);
文件的路径
如果指定了 LOCAL ,则被认为与连接的客户端有关:
- 如果指定了 LOCAL ,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。
- 如果 LOCAL 没有被指定,则文件必须位于服务器主机上,并且被服务器直接读取。
当在服务器主机上为文件定位时,服务器使用以下规则:
- 如果给定了一个绝对的路径名称,则服务器使用此路径名称。
- 如果给定了带有一个或多个引导组件的相对路径名称,则服务器会搜索相对于服务器数据目录的文件。
- 如果给定了一个不带引导组件的文件名称,则服务器会在默认数据库的数据库目录中寻找文件。
注意,这些规则意味着名为 ./myfile.txt 的文件会从服务器数据目录中被读取,而名为 myfile.txt 的同样的文件会从默认数据库的数据库目录中读取。
从客户端使用绝对路径load数据
LOAD DATA LOCAL INFILE ' /import/data.txt ' INTO TABLE db2.my_table;
从服务器里使用相对路径load数据
下面的LOAD DATA语句会从db1数据库目录中读取文件data.txt,因为db1是当前数据库。即使语句明确把文件载入到db2数据库中的表里,也会从db1目录中读取。
USE db1; LOAD DATA INFILE ' data.txt ' INTO TABLE db2.my_table;
IGNORE number LINES选项
IGNORE number LINES选项可以被用于在文件的开始处忽略行。
您可以使用IGNORE 1 LINES来跳过一个包含列名称的起始标题行:
LOAD DATA INFILE ' /tmp/test.txt ' INTO TABLE test IGNORE 1 LINES;
REPLACE和IGNORE
有些输入记录把原有的记录复制到唯一关键字值上。 REPLACE 和 IGNORE 关键字用于控制这些输入记录的操作。
如果您指定了 REPLACE ,则输入行会替换原有行(换句话说,与原有行一样,对一个主索引或唯一索引具有相同值的行)。
如果您指定 IGNORE ,则把原有行复制到唯一关键字值的输入行被跳过。
如果您这两个选项都不指定,则运行情况根据 LOCAL 关键词是否被指定而定。不使用 LOCAL 时,当出现重复关键字值时,会发生错误,并且剩下的文本文件被忽略。使用 LOCAL 时,默认的运行情况和 IGNORE 被指定时的情况相同;这是因为在运行中间,服务器没有办法中止文件的传输。
索引的影响
如果您对一个空的 MyISAM 表使用 LOAD DATA INFILE ,则所有的非唯一索引会被创建在一个独立批中(对于 REPAIR TABLE )。当您有许多索引时,这通常会使 LOAD DATA INFILE 大大加快。通常, LOAD DATA INFILE 的速度会非常快,但是在某些极端情况下,您可以在把文件载入到表中之前使用 ALTER TABLE...DISABLE KEYS 关闭 LOAD DATA INFILE ,或者在载入文件之后使用 ALTER TABLE...ENABLE KEYS 再次创建索引,使创建索引的速度更快。
FIELDS和LINES的默认值
如果您不指定 FIELDS 子句,则默认值为假设您写下如下语句时的值:
FIELDS TERMINATED BY ' \t ' ENCLOSED BY '' ESCAPED BY ' \\ '
如果您不指定 LINES 子句,则默认值为假设您写下如下语句时的值:
LINES TERMINATED BY ' \n ' STARTING BY ''
换句话说,当读取输入值时,默认值会使 LOAD DATA INFILE 按如下方式运行:
在新行处寻找行的边界。
不会跳过任何行前缀。
在制表符处把行分解为字段。
不希望字段被包含在任何引号字符之中。
出现制表符、新行、或在‘\’前有‘\’时,理解为作为字段值一部分的文字字符。
相反的,当编写输出值时,默认值会使 SELECT...INTO OUTFILE 按如下方式运行:
在字段之间写入制表符。
不把字段包含在任何引号字符中。
当字段值中出现制表符、新行或‘\’时,使用‘\’进行转义。
在行的末端写入新行。
注意,要写入 FIELDS ESCAPED BY ‘ \\ ’,您必须为待读取的值指定两个反斜杠,作为一个单反斜杠使用。
备注: 如果您已经在 Windows 系统中生成了文本文件,您可能必须使用 LINES TERMINATED BY ‘ \r\n ’来正确地读取文件,因为 Windows 程序通常使用两个字符作为一个行终止符。部分程序 ,当编写文件时,可能会使用 \r 作为行终止符。要读取这样的文件,应使用 LINES TERMINATED BY ‘ \r ’。
STARTING LINES选项
如果所有您希望读入的行都含有一个您希望忽略的共用前缀,则您可以使用 ' prefix_string ' 来跳过前缀(和前缀前的字符)。如果某行不包括前缀,则整个行被跳过。注释: prefix_string 会出现在一行的中间。
以下面的test.txt为文件源
xxx"row", 1 something xxx"row", 2
使用以下sql导入数据
LOAD DATA INFILE ' /tmp/test.txt ' INTO TABLE test LINES STARTING BY "xxx";
最后 并只得到数据 ("row",1) 和 ("row",2) 。
TERMINATED LINES选项
如果 jokes 被由 %% 组成的行分隔, 要读取包含 jokes 的文件,您可以这么操作:
LOAD DATA INFILE ' /tmp/jokes.txt ' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY ' \n%%\n ' (joke);
TERMINATED,ENCLOSED,ESCAPED FIELD选项
TERMINATED用于控制字段的分隔符,可以为多个字符。
ENCLOSED BY用于用于控制字段的引号, 必须为单一字符, 如果您忽略了词语 OPTIONALLY ,则所有的字段都被包含在 ENCLOSED BY 字符串中, 如果您指定了 OPTINALLY ,则 ENCLOSED BY 字符只被用于包含具有字符串数据类型(比如 CHAR, BINARY, TEXT 或 ENUM )的列中的值.
SELECT...INTO OUTFILE导出数据, ENCLOSED BY '"',忽略OPTIONALLY
" 1 ","a string"," 100.20 "
SELECT...INTO OUTFILE导出数据,ENCLOSED BY '"',指定OPTIONALLY
1 ,"a string", 100.20
ESCAPED BY用于转义,FIELDS ESCAPED BY值必须为单一字符。
如果 FIELDS ESCAPED BY 字符为空字符,则没有字符被转义,并且 NULL 被作为 NULL 输出,而不是 \N 。去指定一个空的转义符不是一个好办法,特别是如果数据的字段值包含任何刚给定的清单中的字符时,更不能这么做。
如果在字段值内出现 ENCLOSED BY 字符,则通过使用 ESCAPED BY 字符作为前缀,对 ENCLOSED BY 字符进行转义。
转自 http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#load-data