MySQL 4.1.0 中文参考手册 --- 6.4 数据操纵:SELECT, INSERT, UPDATE, DELETE[9]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuixin13 的 blog

当从服务器主机定位文件时,服务器使用下列规则:

  • 如果给定一个完整的路径,服务器使用该路径名。
  • 如果给定一个有一个或多个前置构件的相对路径,服务器以相对服务器的数据目录搜索文件。
  • 如果给定一个没有前置构件的文件名,服务器从当前数据库的数据库目录搜寻文件。

注意,这些规则意味着,一个以 `./myfile.txt' 给出的文件是从服务器的数据目录中读取的,然而,以 `myfile.txt' 给出的一个文件是从当前数据库的数据目录下读取的。举例来说,下面的 load data 语句从 db1 数据库目录下读取文件 `data.txt',因为 db1 是当前数据库,即使该语句明确地指定读取的文件被放入到 db2 数据库中的一个表中:

mysql> use db1;
mysql> load data infile "data.txt" into table db2.my_table;

replaceignore 关键词控制对与现有的记录在唯一键值上重复的记录的处理。如果你指定 replace,新的记录行将替换有相同唯一键值的现有记录行。如果你指定 ignore,将跳过与现有的记录行在唯一键值上重复的输入记录行。如果你没有指定任何一个选项,当重复键值出现时,将会发生一个错误,文本文件的剩余部分也将被忽略。

如果你使用 local 关键词从一个本地文件中读取数据,在此操作过程中,服务器没有办法停止文件的传送,因此缺省的处理方式就好像是 ignore 被指定一样。

如果你在一个空的 myisam 表上使用 load data infile,所有非唯一索引会以一个分批方式被创建(就像 repair)。当有许多索引时,这通常可以使 load data infile 更快一些。

load data infileselect ... into outfile 的逆操作。查看章节 6.4.1 select 句法。 使用 select ... into outfile 将数据从一个数据库写到一个文件中。使用 load data infile 读取文件到数据库中。两个命令的 fieldslines 子句的句法是一样的。两个子句都是可选的,但是如果两个同时被指定,fields 子句必须出现在 lines 子句之前。

如果你指定一个 fields 子句,它的子句 (terminated by[optionally] enclosed byescaped by) 也是可选的,不过,你必须至少指定它们中的一个。

如果你没有指定一个 fields 子句,缺省的相同于如果你这样写:

fields terminated by '\t' enclosed by '' escaped by '\\'

如果你没有指定一个 lines 子句,缺省的相同于如果你这样写:

lines terminated by '\n'

换句话说,当读取输入时,缺省值导致 load data infile 表现如下:

  • 在换行符处寻找行的边界。
  • 在定位符处将行分开放到字段中。
  • 不认为字段由任何引号字符封装。
  • 将有 “\” 开头的定位符、换行符或 `\' 解释为字段值的一个文字字符。

相反的,当写入输出时,缺省值导致 select ... into outfile 表现如下:

  • 在字段值间加上定位符。
  • 不用任何引号字符封装字段。
  • 使用 “\” 转义出现在字段值中的定位符、换行符或 `\' 字符实例。
  • 在行的结尾处加上换行符。

注意,为了写 fields escaped by '\\',你必须指定两个反斜线,该值会作为一个反斜线被读入。

ignore number lines 选项可被用于忽略文件开头处的一个列名的头:

mysql> load data infile "/tmp/file_name" into table test ignore 1 lines;

当你一前一后地使用 select ... into outfileload data infile 将数据从一个数据库写到一个文件中,然后再从文件中将它读入数据库中时,两个命令的字段和行处理选项必须匹配。否则,load data infile 将不能正确地解释文件内容。假设你使用 select ... into outfile 以逗号分隔字段的方式将数据写入到一个文件中:

mysql> select * 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 byfields escaped by 值必须是一个单个字符。fields terminated bylines terminated by 值可以超过一个字符。例如,为了写入由回车换行符终止的行,或读取包含这样的行的文件,应该指定一个 lines terminated by '\r\n' 子句。

举例来说,为了读取一个文件到一个 sql 表中,文件以一行 %% 分隔(开玩笑的),你可以这样做:

create table jokes (a int not null auto_increment primary key, joke text
not null);
load data infile "/tmp/jokes.txt" into table jokes fields terminated by ""
lines terminated by "\n%%\n" (joke);

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"

如果你指定 optionallyenclosed by 字符仅被作用于包围 charvarchar 字段:

本文关键:MySQL 4.1.0 中文
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top