更新时间:2024-04-01 GMT+08:00
LOAD DATA
标准示例
LOAD DATA LOCAL INFILE '/data/data.txt' IGNORE INTO TABLE test CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (id, sid, asf);
如果数据中包含一些特殊字符,比如分隔符、转义符等,建议用引号扩起来,通过OPTIONALLY ENCLOSED BY '"'指定。
示例:
下面的一段数据中包含了分隔符(,)则需要用引号括起来。
"aab,,,bba,ddd"
如果数据中包含了引号字符,则上述方法可能不会生效,此时可以把数据中引号字符替换成\"。例如:"aab,,,bba,ddd\"ddd\"bb,ae"。
- 如果指定LOCAL关键词,则表明从客户端主机读文件。如果local没指定,出于安全考虑不支持此功能。
- 可以通过FIELDS TERMINATED BY指定字符之间的分割符号,默认值为\t 。
- 通过OPTIONALLY ENCLOSED BY忽略数据源字段中的符号。
- 通过LINES TERMINATED BY可以指定行之间的换行符,默认为\n。
有些windows上的文本文件的换行符可能为\r\n,由于是不可见字符,所以请小心检查。
- 通过CHARACTER SET指定文件的编码,建议跟RDS for MySQL实例上物理库(分片)的编码一致,否则可能乱码。其中字符集编码必须用引号扩起来,否则会解析出错。
- 通过IGNORE或者REPLACE指定遇到重复记录是替换还是忽略。
- 目前列名必须指定,且必须包括分片字段,否则没办法确定路由。
- 其他参数参考MySQL的load data infile官方文档说明。其他参数的先后顺序不能乱,顺序参考官方说明。
- 数据导入阶段会在一定程度上影响DDM以及RDS for MySQL实例性能,请选择在业务低峰时间导入。
- 建议不要同时发起多个LOAD DATA请求。多个LOAD DATA同时进行,数据高并发写入,表锁竞争以及系统IO抢占会影响总体效率,可能会出现SQL事务超时现象,导致LOAD DATA全部失败。
- 由于分布式事务的特性,使用LOAD DATA导入数据时,需要设置手动提交事务,以确保数据记录改动的准确无误。
mysql> set autocommit=0; mysql> LOAD DATA LOCAL INFILE '/data/data.txt' IGNORE INTO TABLE test CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (id, sid, asf); mysql> commit;
使用限制
- 不支持LOW_PRIORITY。
- 不支持CONCURRENT。
- 不支持PARTITION (partition_name [, partition_name] ...)。
- 不支持LINES STARTING BY 'string'。
- 不支持用户变量。
- ESCAPED BY 只支持'\\'。
- 如果导入数据时没有指定自增键的值,DDM不会填充自增值,自增能力使用的是底层DN的自增能力,因此自增值会重复。
- 如果主键或者唯一索引值经过路由后不在同一张物理表,REPLACE不生效。
- 如果主键或者唯一索引值经过路由后不在同一张物理表,IGNORE不生效。
- 不支持对含有全局二级索引的表执行LOAD DATA的操作。
父主题: 实用SQL语句