[转帖]LOAD DATA INFILE 导入数据
https://www.jianshu.com/p/bcafd8f3ad8e
LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并写入一个表中。文件名称必须为一个文字字符串。
LOAD DATA INFILE 是 SELECT ... INTO OUTFILE 的相对语句。把表的数据备份到文件使用SELECT ... INTO OUTFILE,从备份文件恢复表数据,使用 LOAD DATA INFILE。
1 语法
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char' ]
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = expr,...)]
标准示例
LOAD DATA LOCAL INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
只载入一个表的部分列
LOAD DATA LOCAL INFILE 'persondata.txt' INTO TABLE persondata (col1,col2)
2 LOW_PRIORITY | CONCURRENT 关键字
2.1 LOW_PRIORITY
该参数适用于表锁存储引擎,比如MyISAM, MEMORY, 和 MERGE,在写入过程中如果有客户端程序读表,写入将会延后,直至没有任何客户端程序读表再继续写入。
2.2 CONCURRENT
使用该参数,允许在写入过程中其它客户端程序读取表内容。
3 L0CAL关键字
L0CAL关键字影响数据文件定位和错误处理。只有当 mysql-server 和 mysql-client 同时在配置中指定允许使用,L0CAL关键字才会生效。如果 mysqld 的 local_infile系统变量设置为 disabled,L0CAL关键字将不会生效。详见Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.
L0CAL关键字影响在哪里找到数据文件:
3.1 LOCAL load operations
如果指定了LOCAL,数据文将被客户端程序从客户端主机读取,然后发送给服务器主机。文件路径可以使用绝对路径或相对路径。如果使用相对路径,数据文件实际路径相对于客户端程序启动时的当前路径。
使用LOCAL,将在服务器主机的临时目录创建一个数据文件的副本(linux 使用 /tmp,windows 使用 C:\WINDOWS\TEMP),如果临时目录剩余空间不足,将导致语句执行失败。
3.2 Non-LOCAL load operations
如果没有指定LOCAL,数据五年间必须位于服务器值机上,直接由 mysql-server 读取。mysql-serve 使用如下规则来定位文件:
1. 数据文件使用绝对路径,直接使用
2. 数据文件使用相对路径并且有前导的部分,将相对于 mysql-server 的数据目录查找,例如 ./myfile.txt
3. 数据文件使用相对路径并且没有前导的部分,将相对于默认数据库的数据文件目录查找,例如 myfile.txt
根据上面的规则,./myfile.txt 将被定位到 mysql-server 的 data directory,而 myfile.txt 将被定位到 default database 的 database directory。
如果 db1 时默认数据库,则下面的语句将从 db1 的数据库目录读取 data.txt,即使明确指定把数据装载到 db2
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Non-LOCAL load operations 从服务器主机上读取数据文将。出于安全原因,这个操作需要文件权限。 如果secure_file_priv 系统变量的value 不为空,数据文件必须放在该变量指定的目录。如果该变量为空,数据文件必须可读。
使用LOCAL将比让服务器直接存取文件慢些,因为文件的内容必须从客户主机传送到服务器主机。在另一方面,你不需要file权限装载本地文件。
3.3 L0CAL关键字对错误处理的影响
- 使用 LOAD DATA INFILE,data-interpretation 和 duplicate-key 错误会终止操作
- 使用 LOAD DATA LOCAL INFILE,data-interpretation 和 duplicate-key 错误会发出警告,操作将继续执行。对于duplicate-key错误,效果和指定了 IGNORE 关键字一样。
4 REPLACE | IGNORE 关键字
REPLACE和IGNORE关键词控制对现有的唯一键记录的重复的处理。如果你指定REPLACE,新行将代替有相同的唯一键值的现有行。如果你指定IGNORE,跳过有唯一键的现有行的重复行的输入。如果你不指定任何一个选项,当找到重复键键时,出现一个错误,并且文本文件的余下部分被忽略时。
5 FIELDS 子句
5.1 基本用法
如果你指定一个FIELDS子句,它的每一个子句(TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可选的,但是你必须至少指定一个。
如果你不指定 FIELDS 或 LINES ,缺省值为:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES TERMINATED BY '\n' STARTING BY ''
换句话说,缺省值导致读取输入时,LOAD DATA INFILE表现如下:
- 在 \n 处寻找行边界
- 在 \t 处将行分进字段
- 不要期望字段由任何引号字符封装
- 将由“\”开头的定位符、换行符或“\”解释成转义序列。例如 \t, \n, and \ 分别解释成 定位符,换行,反斜杠。
相反,缺省值导致在写入输出时,SELECT ... INTO OUTFILE表现如下:
- 在字段之间写 \t
2 .不用任何引号字符封装字段 - 使用“\”转义出现在字段中的 定位符、换行符或“\”字符
- 在行尾处写换行符
5.2 FIELDS [OPTIONALLY] ENCLOSED BY
FIELDS [OPTIONALLY] ENCLOSED BY 控制哪些字段应该包裹在引号里面。
对于SELECT ... INTO OUTFILE 输出,如果不包含OPTIONALLY选项,所有的字段将会被ENCLOSED BY指定的字符包裹,例如:
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果我们指定OPTIONALLY,只有string数据类型(如 CHAR, BINARY, TEXT, 或 ENUM)的字段才会被ENCLOSED BY指定的字符包裹,例如:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
注意,如果在字段值内出现ENCLOSED BY字符,则通过使用ESCAPED BY字符作为前缀,对ENCLOSED BY字符进行转义。另外,要注意,如果指定了一个空ESCAPED BY值,则可能会生成不能被LOAD DATAINFILE 正确读取的输出值。例如:
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
5.3 FIELDS ESCAPED BY
用来控制如何对特殊字符进行读写,如上面一个例子,导出和导入时指定FIELDS ESCAPED BY为双引号["]才能被正确的导入,导出的格式如下,对字段内的双引号["]进行了转义。
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a #" quote",102.20
4,"a string containing a #", quote and comma",102.20
对于输入:
假如FIELDS ESCAPED BY指定字符非空,则输入时该字符被移除,后续的内容被添加到字段里。一些两个字符的字符串序列且第一个字符是转义字符的例外 。这些字符序列见下表。
Character| Escape Sequence
-------|----------
\0 | An ASCII NUL (X'00') character
\b | A backspace character
\n | A newline (linefeed) character
\r | A carriage return character
\t | A tab character.
\Z | ASCII 26 (Control+Z)
\N | NULL
假如FIELDS ESCAPED BY指定字符为空,将不会发生转义序列的解释。
对于输出:
如果FIELDS ESCAPED BY指定字符非空,字符作为以下输出的前缀。
1. FIELDS ESCAPED BY 字符,例如 \
2. FIELDS [OPTIONALLY] ENCLOSED BY 字符,例如 "
3. FIELDS TERMINATED BY and LINES TERMINATED BY 的 value 的第一个字符,例如\n
4. ASCII 0
如果LINES TERMINATED BY是空字符串,FIELDS TERMINATED BY非空,字符将不会被转义,NULL 将输出为 NULL而不是 \N。指定LINES TERMINATED BY为空字符串并不是个好主意,特别当内容中包含上表列出的特殊字符时。
5.4 LINES STARTING BY
如果所有希望读入的行都含有一个我们希望忽略的共用前缀,则可以使用 LINES STARTING BY 'prefix_string' 来跳过前缀(以及该前缀前的所有字符)。如果某行不包括前缀,则整个行被跳过。
例如:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
FIELDS TERMINATED BY ',' LINES STARTING BY 'xxx';
假如/tmp/test.txt文件内容如下
xxx"abc",1
something xxx"def",2
"ghi",3
则我们读入的内容包括("abc",1) 和 ("def",2),第三行直接被跳过。
IGNORE number LINES
该选项可以被用于在文件的开始处忽略行。例如,我们可以使用IGNORE 1 LINES来跳过一个包含列名称的起始标题行。
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
5.5 在特定情况下,field-和line-handling选项相互影响
如果LINES TERMINATED BY是空字符串,FIELDS TERMINATED BY非空,行以FIELDS TERMINATED BY指定的字符串作为结尾。
如果FIELDS TERMINATED BY 与 FIELDS ENCLOSED BY值均为空(''),将使用固定行(无分割)格式。使用固定行格式,字段之间将没有分隔符(行终止符依然可使用),列字段数据的读取和写入均按照字段定义的宽度去操作,如 TINYINT, SMALLINT, MEDIUMINT, INT, 和 BIGINT, 字段宽度分别为4, 6, 8, 11, 和 20。
5.5 不适合使用 LOAD DATA INFILE 的情况
1. 使用固定行格式(即FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 均为空),列字段类型为BLOB或TEXT。
2. 指定分隔符与其它选项前缀一样,LOAD DATA INFILE不能对输入做正确的解释。例如:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
3. 如果 FIELDS ESCAPED BY 为空,字段值包含 FIELDS ENCLOSED BY 指定字符,或者 LINES TERMINATED BY 的字符在 FIELDS TERMINATED BY 之前,都会导致过早的停止 LOAD DATA INFILE操作。因为LOAD DATA INFILE不能准确的确定行或列的结束。
6 IGNORE number LINES 选项
IGNORE number LINES选项可以被用于在文件的开始处忽略行。
您可以使用IGNORE 1 LINES来跳过一个包含列名称的起始标题行:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
7 选择导入的列
下面的语句会导入文件的所有列
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
如果我们想导入表的某些列,需要指定列的列表
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
如果输入文件与表的列顺序不同,我们必须指定一个列清单,否则mysql不能把输入文件的字段与表的列匹配起来。
mysql> LOAD DATA INFILE '/tmp/loadtest.txt' INTO TABLE loadtest
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '#'
LINES TERMINATED BY '\n'
(c1, c2, c4, c3);
列的清单可以包含列名或者用户变量,在写入列前我们需要使用SET语句对用户变量进行转换。对set语句及用户变量有如下使用方法:
方法1:在用户变量用于第一列之前,先把第一列的值赋予用户变量,进行除法操作后输入到c1。
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @var1)
SET column2 = @var1/100;
方法2The SET clause can be used to supply values not derived from the input file. 。使用下面例子把c3列设为当前时间
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, column2)
SET column3 = CURRENT_TIMESTAMP;
方法3:把输入赋予用户变量,而不把用户变量赋予表中的列,来丢弃此输入值。
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);
7 通过管道导入数据:
在unix系统中,如果我们想要从管道(pipe)中load data,需要用如下方法:
[root@localhost tmp]# mkfifo /tmp/ls.dat
[root@localhost tmp]# chmod 666 /tmp/ls.dat
[root@localhost tmp]# find / -ls > /tmp/ls.dat &
[root@localhost tmp]# mysql -e "LOAD DATA INFILE '/tmp/ls.dat' INTO TABLE test.tb1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '#' LINES TERMINATED BY '\n'"
注意:sql-mode使用严格事物模式STRICT_TRANS_TABLES会报错
在另一窗口将数据写入管道
[root@localhost /]# cat /tmp/loadtest.txt > /tmp/ls.dat
注:可以先读或者先写管道,谁先谁后都可以,在写入管道的数据被全部读出前,处于阻塞状态。
参考
LOAD DATA INFILE Syntax
mysql导入数据load data infile用法
[转帖]LOAD DATA INFILE 导入数据的更多相关文章
- Mysql load data infile 导入数据出现:Data truncated for column
[1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...
- mysql中使用load data infile导入数据的用法
有时需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用mysql load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. LO ...
- 合理使用mysql中的load data infile导入数据
基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ignore]into table tbl_name ...
- 关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题
在使用MySQL时,常常会用到Load Data Infile来导入数据,在遇到Date类型的列时,有时会遇到格式转换的问题: 首先创建一张简单的people表,包含名字,生日,年龄三个字段: mys ...
- 解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。
问题:在ubuntu server 上使用apt-get 安装完 mysql 使用 load data infile 出现错误,错误代码如下: ERROR (): The used command i ...
- mysql导入数据load data infile用法整理
有时候我们需要将大量数据批量写入数据库,直接使用程序语言和Sql写入往往很耗时间,其中有一种方案就是使用MySql Load data infile导入文件的形式导入数据,这样可大大缩短数据导入时间. ...
- mysql load data infile的使用 和 SELECT into outfile备份数据库数据
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE t ...
- load data infile出现“ERROR 13 (HY000): Can't get stat of '/tmp/test2.txt' (Errcode: 2)”问题
用load data infile导数据到mysql数据库出现这个该问题,解决方法如下: 安全起见,连接mysql的语句需要添加–local-infile, mysql -hlocalhost -ur ...
- mysql 的load data infile
LOAD DATA INFILE语句从一个文本文件中以很高的速度读入一个表中.如果指定LOCAL关键词,从客户主机读文件.如果LOCAL没指定,文件必须位于服务器上.(LOCAL在MySQL3.22. ...
- mysql导入数据load data infile用法
mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...
随机推荐
- CUDA C编程权威指南:1.3-CUDA基础知识点梳理
主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的. 1.CUDA数组 解析:CUDA数组 ...
- GaussDB技术解读系列丨运维自动驾驶探索
本文分享自华为云社区<DTCC 2023专家解读 | GaussDB技术解读系列之运维自动驾驶探索>,作者:GaussDB 数据库 . 近日,在第14届中国数据库技术大会(DTCC2023 ...
- 共赴元宇宙新纪元,华为云VR开发应用大赛总决赛倒计时7天!
摘要:"第三届华为云VR开发应用暨沈阳元宇宙开发应用大赛"总决赛即将于2月13日在沈阳市和平区揭幕. 由沈阳市和平区人民政府.华为技术有限公司共同主办的"第三届华为云VR ...
- AOC萌新探索:搭建和体验在线AOC环境
摘要:AOC是一个做网络设备自动化运维以及三方设备纳管的一个能力平台. 本文分享自华为云社区<AOC萌新探索之旅第一期--在线AOC环境初体验>,作者:oysterzz. 接触AOC没多久 ...
- iOS代码混淆-从入门到放弃
iOS代码混淆-从入门到放弃 目录 1. 什么是iOS代码混淆? 2. iOS自动代码混淆的方法是什么? 3. iOS代码混淆的作用是什么? 4. 怎么样才能做到更好的iOS代码混淆? 总结 参考 ...
- 开放 LLM 排行榜: 深入研究 DROP
最近,开放 LLM 排行榜 迎来了 3 个新成员: Winogrande.GSM8k 以及 DROP,它们都使用了 EleutherAI Harness 的原始实现.一眼望去,我们就会发现 DROP ...
- ChatExcel?
大家好,我是章北海mlpy 最近在浅学LangChain,在大模型时代,感觉这玩意很有前途. LangChain是一个开源的应用开发框架,目前支持Python和TypeScript两种编程语言. 它赋 ...
- 机器学习的线性代数(Python 版)
线性代数是数学的分支学科,涉及矢量.矩阵和线性变换.它是机器学习的重要基础,从描述算法操作的符号到代码中算法的实现,都属于该学科的研究范围. 虽然线性代数是机器学习领域不可或缺的一部分,但二者的紧密关 ...
- let、var、const区别
1.var:传统的变量声明方式 在ES5及之前的JavaScript版本中,我们通常使用var关键字声明变量.var具有以下特点: 函数作用域:变量的作用域限制在声明的函数内部,如果在函数外部访问,将 ...
- Go--统计数组中重复的元素及重复次数
代码: package main import ( "fmt" ) func main() { //创建有重复数值的数组 a1 := []int{1, 2, 3, 1, 4, 5, ...