mysql中load data file 使用
欢迎进群交流: 363034250
前言
有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间。
基本语法
load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
使用条件
- mysqld进程服务已经在运行;
- 要读取的文件须处于数据库目录或者可以被所有人读取;
- 需要有文件的file权限;
使用过程
本地服务器导入
load data infile "path" into tablename
效果图:
从远程客户端文本导入到服务器的数据库中
需要添加–local-infile = 1这个选项
mysql -h 172.17.0.2 -u root -p test --local-infile=1 -e "load data local infile './sql.txt' into table users";
-e 参数:可以执行各种sql语句的操作,需要将语句用引号包裹起来
-p 参数:需要输入服务器mysql的密码
-p 后面的test指定的是数据库名
效果图:
这样就写入到了test的users表中;
报错解决方法
- 如果出现这样的报错信息:
说明忘记在-e后面的sql语句中加上local,请看上面的正确的sql语句.
linux下如果使用的是源码编译的mysql,在configure的时候,需要添加参数:–enable-local-infile 客户端和服务器端都需要,否则不能使用local参数
./configure --prefix=/usr/local/mysql --enable-local-infile make install
若是其它系统,可在配置文件中配置:
在MySql 配置文件My.ini文件中下面项中加入local-infile=1:
[mysqld] local-infile=1 [mysql] local-infile=1
注意编码
若包含中文,请保证导入文件、连接字符串、导入表都是UTF-8编码
更多用法
如果你指定关键词low_priority,那么MySQL将会等到没有其他人读这个表的时候,才把数据插入。可以使用如下的命令:
load data low_priority infile "/home/mark/data sql" into table Orders;
replace和ignore关键词控制对现有的唯一键记录的重复的处理。如果你指定replace,新行将代替有相同的唯一键值的现有行。如果你指定ignore,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键时,出现一个错误,并且文本文件的余下部分被忽略。例如:
load data low_priority infile "/home/mark/data sql" replace into table Orders;
分隔符
- fields关键字指定了文件记段的分割格式,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
参数 | 描述 |
---|---|
terminated by xx | 意思是以什么字符作为分隔符, 默认情况下是tab字符(\t) |
enclosed by xx | 字段括起字符 |
escaped by xx | 转义字符, 默认的是反斜杠(backslash:\ ) |
使用方法:
load data infile "/home/mark/Orders txt" replace into table Orders fields terminated by',' enclosed by '"';
- lines 关键字指定了每条记录的分隔符默认为’\n’即为换行符
如果两个字段都指定了,那么fields必须在lines之前。
使用方法:
load data infile "/jiaoben/load.txt" replace into table test fields terminated by ',' lines terminated by '/n';