PingKai Logo下载

LOAD DATA

LOAD DATA 语句用于将数据批量加载到 TiDB 表中。

在 v7.0.0 版本支持以下功能:

  • 支持从 S3、GCS 导入数据
  • 新增参数 FIELDS DEFINED NULL BY

语法图

LoadDataStmt
LOAD DATA LocalOpt INFILE stringLit DuplicateOpt INTO TABLE TableName CharsetOpt Fields Lines IgnoreLines ColumnNameOrUserVarListOptWithBrackets LoadDataSetSpecOpt
LocalOpt
LOCAL
DuplicateOpt
IGNORE REPLACE
Fields
TERMINATED BY stringLit OPTIONALLY ENCLOSED BY stringLit ESCAPED BY stringLit DEFINED NULL BY stringLit OPTIONALLY ENCLOSED

参数说明

LOCAL

你可以使用 LOCAL 来指定导入位于客户端的数据文件,此时传入文件参数必须为客户端文件系统路径。

REPLACEIGNORE

你可以使用 REPLACEIGNORE 参数来指定遇到重复数据时的处理方式。

  • REPLACE:遇到重复数据时,覆盖现有数据。
  • IGNORE:遇到重复数据时,忽略新导入的行,保留已存在的数据。

默认情况下,遇到重复数据会报错。

S3/GCS 路径

如果你不指定 LOCAL,则文件参数必须是有效的 S3/GCS URI 路径,详见外部存储

当数据文件存储在 S3/GCS 上时,你可以导入单个文件,也可使用通配符 * 来匹配需要导入的多个文件。注意通配符不会递归处理子目录下相关的文件。以数据存储在 S3 为例,示例如下:

  • 导入单个文件:s3://<bucket-name>/path/to/data/foo.csv
  • 导入指定路径下的所有文件:s3://<bucket-name>/path/to/data/*
  • 导入指定路径下的所有以 .csv 结尾的文件:s3://<bucket-name>/path/to/data/*.csv
  • 导入指定路径下所有以 foo 为前缀的文件:s3://<bucket-name>/path/to/data/foo*
  • 导入指定路径下以 foo 为前缀、以 .csv 结尾的文件:s3://<bucket-name>/path/to/data/foo*.csv

FieldsLinesIgnore Lines

你可以使用 FieldsLines 参数来指定如何处理数据格式:

  • 使用 FIELDS TERMINATED BY 来指定数据的分隔符号。
  • 使用 FIELDS ENCLOSED BY 来指定数据的包围符号。
  • 如果你希望以某个字符为结尾来切分行数据,可以使用 LINES TERMINATED BY 来指定行的终止符。

可以使用 DEFINED NULL BY 来指定数据文件中如何表示 NULL 值。

  • 与 MySQL 行为一致,如果 ESCAPED BY 不为空时,例如是默认值 \,那么 \N 会被认为是 NULL 值。
  • 如果使用 DEFINED NULL BY,例如 DEFINED NULL BY 'my-null'my-null 会被认为是 NULL 值。
  • 如果使用 DEFINED NULL BY ... OPTIONALLY ENCLOSED,例如 DEFINED NULL BY 'my-null' OPTIONALLY ENCLOSEDmy-null"my-null"(假设 ENCLOSED BY '"')会被认为是 NULL 值。
  • 如果没有使用 DEFINED NULL BY 或者 DEFINED NULL BY ... OPTIONALLY ENCLOSED,但使用了 ENCLOSED BY,例如 ENCLOSED BY '"',那么 NULL 会被认为是 NULL 值。这个行为与 MySQL 一致。
  • 其他情况不会被认为是 NULL 值。

例如对于以下格式的数据:

"bob","20","street 1"\r\n
"alice","33","street 1"\r\n

如果想分别提取 bob20street 1,可以指定数据的分隔符号为 ',',数据的包围符号为 '\"'。可以写成:

FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'

当不指定处理数据的参数时,将按以下参数处理:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''

你可以通过 IGNORE <number> LINES 参数来忽略文件开始的 <number> 行。例如,可以使用 IGNORE 1 LINES 来忽略文件的第一行。

示例

通过 LOAD DATA 导入数据,指定数据的分隔符为逗号,忽略包围数据的引号,并且忽略文件的第一行数据。

如果此时遇到 ERROR 1148 (42000): the used command is not allowed with this TiDB version 报错信息。可以参考文档解决:ERROR 1148 (42000): the used command is not allowed with this TiDB version 问题的处理方法

LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);
Query OK, 815264 rows affected (39.63 sec)
Records: 815264  Deleted: 0  Skipped: 0  Warnings: 0

LOAD DATA 也支持使用十六进制 ASCII 字符表达式或二进制 ASCII 字符表达式作为 FIELDS ENCLOSED BYFIELDS TERMINATED BY 的参数。示例如下:

LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY x'2c' ENCLOSED BY b'100010' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);

以上示例中 x'2c' 是字符 , 的十六进制表示,b'100010' 是字符 " 的二进制表示。

MySQL 兼容性

TiDB 中的 LOAD DATA 语句语法上兼容 MySQL(除字符集选项被解析但会被忽略以外)。若发现任何语法兼容性差异,请尝试 TiDB 支持资源

另请参阅