欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL load语句详细介绍

程序员文章站 2024-03-01 23:13:34
load的语法 复制代码 代码如下: load data [low_priority | concurrent] [local] infile 'file_name.t...

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,则被认为与连接的客户端有关:

 1.如果指定了local,则文件会被客户主机上的客户端读取,并被发送到服务器。文件会被给予一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于启动客户端时所在的目录。

 2.如果local没有被指定,则文件必须位于服务器主机上,并且被服务器直接读取。

当在服务器主机上为文件定位时,服务器使用以下规则:

1).如果给定了一个绝对的路径名称,则服务器使用此路径名称。
2).如果给定了带有一个或多个引导组件的相对路径名称,则服务器会搜索相对于服务器数据目录的文件。
3).如果给定了一个不带引导组件的文件名称,则服务器会在默认数据库的数据库目录中寻找文件。

注意,这些规则意味着名为./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字符进行转义。