MySQL从文件中将数据高速导入数据库:LOAD DATA INFILE语句
本章内容参考来源:https://www.mysqlzh.com/doc/126/255.html
LOAD DATA INFILE语句用于高速地从文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。
LOAD DATA [LOW_PRIORITY|CONCURRENT] [LOCAL] INFILE 'filename.txt' [REPLACE|IGNORE] INTO TABLE tb_name [FIELDS [TERMINTED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINTED BY 'string'] ] [IGNORE number LINES] [(col_name_or_user_var,...)] [SET col_name = expr,...]
- LOW_PRIORITY:使用LOW_PRIORITY,则LOAD DATA语句的执行将被延迟,直到没有其他客户端从表中读取为止;
- CONCURRENT:如果一个MyISAM表满足同时插入的条件(即该表在中间有空闲块),并且用户对MyISAM表指定了CONCURRENT,则当LOAD DATA正在执行时,其他线程会在表中重新获取数据。即使没有其他线程在同时使用本表格,使用本选项也会略微影响LOAD DATA的性能;
- LOCAL:如果指定了LOCAL,则被认为与连接的客户端有关,文件会被客户主机上的客户端读取,并被发送到服务器。文件需制定一个完整的路径名称,以指定确切的位置。如果给定的是一个相对的路径名称,则此名称会被理解为相对于相对于启动客户端时所在的目录。如果LOCAL没有被指定,则文件必须位于服务器主机上,并且被服务器直接读取。当在服务器上为文件定位时,如果给定了一个绝对的路径名称,则服务器使用此路径名称;如果给定了一个或多个带引导主键的相对路径名称,则服务器会搜索相对于服务器数据目录的文件;如果给定了一个不带引导组件的文件名称,则服务器会在默认数据库的数据目录(/mysql/data/dbname)中寻找文件。
注意:这些规则意味着名为'./myfile.txt'的文件会从服务器数据目录中读取,而名为'myfile.txt'的文件同样会从默认数据库的数据库目录中读取,例如:下面的LOAD DATA会从db1数据库目录中读取'data.txt'文件,因为db1是当前数据库。
mysql> USE DB1; mysql> LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
注意:使用正斜杠(/)指定Windows路径名称,如果是反斜杠,则必须使用两个(\\)。
出于安全原因,读取位于服务器中的文本文件时,文件必须位于数据库目录中,或者是全体可读的。另外,要对服务器文件使用'LOCAL DATA INFILE',必须拥有FILE权限。FILE权限给予用户使用'LOAD DATA INFILE'和'SELECT ... INTO OUTFILE'读和写服务器上文件的权利,任何被授予FILE权限的用户都能够读或写MySQL服务器能读或写的任何文件。FILE权限允许用户在MySQL服务器具有写权限的目录下创建新文件,但不能覆盖已有文件。
与让服务器直接读取数据相比,使用LOCAL的速度略慢,这是因为文件的内容必须通过客户端发送到服务器上,不过用户不需要FILE权限来载入本地文件。
只有当服务器与客户端都许可时,LOCAL才可运行。如果使用--local-infile=0来启动mysqld,则LOCAL不运行。可在MySQL的配置文件中做好配置,如下所示:
- REPLACE:如果指定了REPLACE,表中的一个旧记录与一个用PRIMARY KEY或一个UNIQUE索引的新纪录具有相同的值,则在新纪录被插入之前,旧记录将被删除,若表中没有PRIMARY KEY或UNIQUE索引,则使用REPLACE毫无意义;
- IGNORE:如果指定了IGNORE,表中的一个旧记录与一个用PRIMARY KEY或一个UNIQUE索引的新纪录具有相同的值,则跳过这条新纪录;
如果这两个选项都不指定,则运行情况根据LOCAL关键词是否被指定而定。不使用LOCAL时,当出现重复关键字时,会发生错误,并且剩下的文本文件被忽略。使用LOCAL时,默认的运行情况和IGNORE被指定时的情况相同;这是因为在运行中间,服务器没法中止文件的传输。
- FIELDS:如果你指定了一个FIELDS子句,则每个亚子句(TERMINATED BY,[OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是自选的,不过,必须指定其中至少一个。
如果你不指定FIELDS子句,则默认值如下:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果你不指定LINES子句,则默认值如下:
LINES TERMINATED BY '\n' STARTING BY ''
注:FIELDS和LINES子句的语法对于两个语句是一样的。两个子句都是自选的,但是如果两个都被指定了,FIELDS必须位于LINES前。
- IGNORE number LINES:这个选项用于在文件的开始处忽略行,例如:
IGNORE 1 LINES
上面的语句表示跳过文件的第一行。
- (col_name_or_user_var,...):指定将文件内各列数据插入到数据库对应字段;
- SET col_name=expr:指定数据库某字段的值。