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:指定数据库某字段的值。
posted @ 2023-02-06 17:38  夏末蝉未鸣  阅读(730)  评论(0编辑  收藏  举报