MySQL 将文件导入数据库(load data Statement)

news2024/9/22 15:40:15

前面我们介绍过如何用select…into outfile语句将SQL查询结果导出到文件:
MySQL 将查询结果导出到文件(select … into Statement)

MySQL同时也提供互补的功能,可以使用load data infile语句将文件中的数据加载到数据库中,这个文件可以是MySQL导出的文件或其他来源。本文将介绍load data infile语句的用法及在使用过程中常见问题的解决方式。

文章目录

  • 一、load data语句简介
  • 二、用法示例
    • 2.1 基本用法
    • 2.2 数据格式的处理
  • 三、常见导入问题的处理
    • 2.3 标题行的处理
    • 2.2 主键/唯一索引冲突的处理
    • 2.3 文件和表的列数量不同或顺序不同
    • 2.4 导入部分列
    • 2.5 导入过程中处理数据

一、load data语句简介

MySQL的load data infile语句可以从文本文件中读取数据,并且加载到数据库的表中。和select…into outfile只能导文件到本地数据库服务器不同,load data语句即可以从数据库服务器本地读取文件,也可以通过远程客户端(使用local关键字)读取,即可以远程将文件加载到数据库中。

MySQL还提供了一个mysqlimport命令行工具也可以将数据从文件加载到数据库中,其原理也是通过load data infile语句完成的。

二、用法示例

默认情况下,load data infile语句是从数据库服务器加载数据的,为了安全起见,一般MySQL都会配置secure_file_priv参数,来指定可以读写文件的目录,将要导入的文件放在此参数指定的目录下。

show variables like 'secure_file_priv';

在这里插入图片描述

我们先通过导出数据的方式创建一个文件,这里在示例数据库employees下新建一张测试表并插入几条数据:

create table person(
id int not null auto_increment primary key,
name varchar(32),
salary decimal(10,2),
remark varchar(128));

insert into person values(null, 'Vincent', 1000, 'AAA');
insert into person values(null, 'Victor', 2000, 'BBB');
insert into person values(null, 'Grace', 3000, 'CCC');

在这里插入图片描述

数据内容如下:

select * from person;

在这里插入图片描述

使用select…into outfile将数据导出到文件(路径就是secure_file_priv参数指定的目录),这里使用默认格式导出:

select * from person into outfile '/opt/mysql8.0.35/mysql-files/person.txt';

在这里插入图片描述

导出的person.txt文件内容如下(数据以tab分隔):
在这里插入图片描述

2.1 基本用法

由于load data infile和select into outfile语句是互补的,所以它们的格式设定语法是一样的。select…into outfile采用默认格式导出的文件就是load data infile的默认导入格式。这种情况下,直接指定文件名及要导入表名即可(这里先清空person表):

truncate table person;

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person;

select * from peron;

在这里插入图片描述

2.2 数据格式的处理

但也有很多情况数据的来源不是MySQL导出的文件,格式也不同。例如常用的CSV格式文件,我们手动将刚才文件改为CSV格式(以逗号分隔数据),且第一行数据中remark字段还额外包含了一个逗号(红框处):
在这里插入图片描述

碰到这种和默认格式不同的数据,MySQL就无法解析了,如果直接导入就会报错:
在这里插入图片描述

此时需要通过格式子句来告诉MySQL如何解析数据,默认的格式子句如下:

fields terminated by '\t' encolded by '' escaped by '\\'
lines terminated by '\n' starting by ''

含义解释:

  • fields 表示字段属性,terminated by ‘\t’ 以制表符分割字段,enclosed by ‘’ 不包裹字段,escaped by ‘\’ 反斜线表示转义符
  • lines 表示行属性,terminated by ‘\n’ \n代表换行符,starting by ‘’ 行的起点字符是空。

我们分析一下这里数据的格式和默认格式的区别,字段的分隔符是逗号,因此需要 fields terminated by ‘,’,指定逗号为分隔符。同时注意第一行的remak字段是"Hello, Vincent!“,引号中逗号又是数据内容,这个逗号不能识别为分隔符,因此还需要指定 enclosed by '”',指定双引号之内的内容是一个字段。增加这个两个子句后,可以看到数据格式识别成功:

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person
fields terminated by ',' enclosed by '"';

在这里插入图片描述

三、常见导入问题的处理

除了基础导入场景,我们可能还会遇到一些其他问题或者数据加工需求,下面就是导入中常见问题的解决方法。

2.3 标题行的处理

如果文件的第一行是标题而不是数据,那么在导入时我们就需要进行忽略处理,你可以手动从文本文件中删除这一行。或者,使用ignore n lines/rows子句来告诉MySQL导入时跳过前n行,我们上面的文本中再增加一行标题:
在这里插入图片描述

导入时,通过ignore 1 lines/rows语句,忽略第一行:

truncate table person;

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person
fields terminated by ',' enclosed by '"'
ignore 1 lines;    -- 忽略第一行

select * from person;

在这里插入图片描述

可以看到第一行标题并未导入,而是从第二行数据开始读取。

2.2 主键/唯一索引冲突的处理

上面的示例中,我们每次导入前都执行了truncate table清空表,即每次都是往空表中导入。但如果表中已经有数据了,导入时就可能发生主键/唯一索引冲突。向已有数据的表中导入数据时如果发生了主键/唯一索引冲突,我们有2个选择:忽略或更新

  • ignore,遇到键值冲突时 忽略数据
  • replace,遇到键值冲突时 更新数据

手动修改一下文件内容,将Vincent的salary改为4000:
在这里插入图片描述

在into table语句前增加一个ignore关键字,这样出现键值冲突时会忽略而不是报错:

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' ignore into table person
fields terminated by ',' enclosed by '"';

在这里插入图片描述
可以看到Vincent的salary并没有更新,同时日志提示忽略了3行。

在into table语句前增加一个replace关键字,这样出现键值冲突时会更新数据:

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' replace into table person
fields terminated by ',' enclosed by '"';

在这里插入图片描述
这里Vincent的salary被更新成了4000,日志中的Deleted 1说明实际操作是将原数据删除再插入数据。如果文件每次需要更新导入,那么replace关键字就很适合。

2.3 文件和表的列数量不同或顺序不同

前面每次导入时我们都只提供了表名,这就要求文本中数据的列和数据库中表的列数量要相同,并且顺序是对应的。如果文件中字段顺序和表不同,或者字段数量不同,那么就需要手动指定导入顺序。

我们修改一下表结构,在name和salary之间增加一个extra_column,此时表的字段就比文件中字段数多了,且顺序也不对应:

alter table person add extra_column int after name;

在这里插入图片描述

此时导入数据就需要根据文件中字段的顺序来指定表的列名:

truncate table person;
load data infile '/opt/mysql8.0.35/mysql-files/person.txt' replace into table person
fields terminated by ',' enclosed by '"'
(id,name,salary,remark);    -- 指定导入的列名顺序

在这里插入图片描述
注意列名是单独放在语句最后(如果有set子句则在set语句之前),而不是紧跟在表名后。

2.4 导入部分列

如果只想将文件中的部分列导入数据库,即丢弃部分列的数据。我们也可以通过指定列名的方式来实现,通过仅指定需要导入数据的列名,而想丢弃的数据用一个变量名来占位,这样对应的列数据就不会被导入到数据库中。

例如导入数据时,仅想导入id,name,salary这3列,忽略remark列:

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person
fields terminated by ',' enclosed by '"'
(id,name,salary,@var);

在这里插入图片描述
这里用@var来占位,而不是指定remark列名,因此remark列没有数据导入,相当于仅导入了部分列。

2.5 导入过程中处理数据

除了将数据原封不动导入之外,load data infile语句还支持一个set子句让你在导入过程中对数据进行加工处理。

例如记录导入时间,我们再增加一个列import_time,用来记录数据导入时间:

alter table person add import_time timestamp;

truncate table person;

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person
fields terminated by ',' enclosed by '"'
(id,name,salary,remark)
set import_time=current_timestamp;

select * from person;

在这里插入图片描述
在语句的最后,增加了一个set import_time=current_timestamp子句,它会导入时设置import_time列为当前时间戳(虽然数据都不在文件中)。

对于想要加工的列,我们可以先将列赋给变量,然后对变量加工后,再通过set子句写入表的列,达到先加工后导入的效果。例如对于salary列,如果值小于3000,那么就加999:

truncate table person;

load data infile '/opt/mysql8.0.35/mysql-files/person.txt' into table person
fields terminated by ',' enclosed by '"'
(id,name,@sal,remark)
set salary=if(@sal<3000, @sal+999, @sal);

select * from person;

在这里插入图片描述
导入时,先将值赋给变量@sal,经过if函数的加工后,再通过set子句将加工过后的值写入salary列,可以看到Victor的salary变成了2999。如果没有set子句,那么salary列的值就丢弃了,就是上一节导入部分列的操作。

以上就是MySQL中load data infile语句的用法及常见问题的处理,熟练掌握后可以帮助你快速将数据从文件导入数据库(一个常用的场景就是将Excel文件保存为CSV格式导入数据库)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Robot Operating System——Action通信机制的服务端

大纲 回调接受或者拒绝请求执行任务的回调终止任务回调 创建服务完整代码总结 在《Robot Operating System——Action通信机制概念及Client端》一文中&#xff0c;我们介绍了Action客户端的主要流程。本文我们将介绍Action服务端的编写。 回顾下Action的构成: 目标&#xff0…

cesium canvas广告牌

在有些业务中&#xff0c;对场景中的广告牌样式要求比较高&#xff0c;需要动态显示一些数据&#xff0c;这个时候&#xff0c;我们可以通过将复杂背景样式制作成图片&#xff0c;通过canvas绘制图片和动态数据&#xff0c;从而达到比较好的显示效果。 1 CanvasMarker 类封装 …

ICM-20948芯片详解(2)

接前一篇文章&#xff1a;ICM-20948芯片详解&#xff08;1&#xff09; 二、详述 ICM-20948是一款9轴运动跟踪设备&#xff0c;全部采用3x3x1mm QFN封装。ICM-20948是一个多芯片模块&#xff08;MCM&#xff09;&#xff0c;由集成在单个QFN封装中的两个管芯组成。一个芯片内装…

2024年【制冷与空调设备运行操作】考试技巧及制冷与空调设备运行操作考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作考试技巧考前必练&#xff01;安全生产模拟考试一点通每个月更新制冷与空调设备运行操作考试试题题目及答案&#xff01;多做几遍&#xff0c;其实通过制冷与空调设备运行操作作业模拟考试很简…

leetcode173. 二叉搜索树迭代器,注意vector中的size()的无符号整数类型,无符号整数和有符号整数的加减比大小有着种种大坑

leetcode173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分…

【MySQL】全面剖析索引失效、回表查询与索引下推

1.索引失效的情况 以tb_user表举例&#xff0c;id为主键索引、name和phone字段上建立了一个普通索引&#xff0c;name和phone均为varchar类型。 索引列运算 当在 WHERE 子句或 JOIN 子句中对列使用函数或表达式时&#xff0c;索引会失效。 执行以下语句&#xff0c;可以发现执…

分布式事务原理

目录 第一节&#xff1a;分布式事务基础详细总结 1.1 事务的核心特性&#xff08;ACID&#xff09; 1.2 分布式事务的挑战 1.3 分布式事务的实现难点 1.4 分布式事务解决方案概览 图解&#xff1a;分布式事务的ACID特性 第二节&#xff1a;事务消息方案详细总结 2.1 事务…

AUTOSAR实战教程-使用DET来发现开发错误

2年之前因为在调试AUTOSAR存储协议栈的时候使用DET并没发现有用的信息,所以就武断下结论--这玩意没有用。活到老学到老吧,bug经历的多了,发现这玩意还挺有用的。说一下这个bug的背景。 在将时间同步报文改道CanTsync之后,由于这个AUTOSAR工具本身的问题以及配置工程师本身的…

SpringBoot校园社团场地租借平台开发-计算机毕业设计源码00746

摘 要 这个项目旨在开发一个基于SpringBoot 的校园社团场地租借平台&#xff0c;帮助学校社团更方便地租借校园内的场地。用户可以在平台上浏览不同场地的信息、预订场地、查看租借历史记录等。管理员可以管理场地信息、审批租借申请和生成报表统计等功能。通过该平台&#xff…

【大模型实战篇】搭建本地的隐私计算知识问答系统“密答”

1. 背景介绍 在之前分享的文章《基于开源大模型的问答系统本地部署实战教程》中&#xff0c;我们介绍了基于ollama实现本地问答系统的部署和使用。本文将基于ollama进一步实现本地垂直领域的问答系统搭建。ollama作为大模型的运行框架&#xff0c;可以提供大模型的使用接口…

Python 设计模式之建造者模式

文章目录 建造者模式中的简单版本逐渐复杂的问题建造者模式的实现 建造者模式中的经典版本 建造者&#xff08;builder&#xff09;模式属于创建型模式&#xff0c;建造者模式一般有两种类型的应用 建造者模式中的简单版本 逐渐复杂的问题 假设现在需要创建一个用户对象&…

如何提高小红书种草转化率

企业和品牌方想要在小红书上做种草推广一般分为图文种草和视频种草两种形式&#xff0c;而且小红书是一个完全可以依靠内容实现涨粉、变现、种草转化的平台&#xff01; 因为小红书是算法推荐制&#xff0c;将你的作品放在流量池中检测&#xff0c;满足要求就能进入下一个流量池…

Python酷库之旅-第三方库Pandas(061)

目录 一、用法精讲 236、pandas.Series.explode方法 236-1、语法 236-2、参数 236-3、功能 236-4、返回值 236-5、说明 236-6、用法 236-6-1、数据准备 236-6-2、代码示例 236-6-3、结果输出 237、pandas.Series.searchsorted方法 237-1、语法 237-2、参数 237-…

Linux 内核源码分析---插入和删除模块

模块是一种向 Linux 内核添加设备驱动程序、文件系统及其他组件的有效方法&#xff0c;不需编译新内核或重启系统。 模块具有如下优点&#xff1a; • 通过使用模块&#xff0c;内核发布者能够预先编译大量驱动程序&#xff0c;而不会致使内核映像的尺寸发生膨胀&#xff1b; …

PTA—基础编程题目集(7-18)

7-18 二分法求多项式单根 目录 题目描述 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 参考代码 总结 题目描述 输入在第1行中顺序给出多项式的4个系数a3​、a2​、a1​、a0​&#xff0c;在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间…

60_1简单的学生管理系统【功能实现(查看所有学生(分页)、修改和删除学生信息)】

功能实现 老师角色查看所有学生 获取学生列表和分页 1.修改index.jsp 不能直接跳stuList.jsp&#xff0c;没数据 <%if("teacher".equals(role)){%><a href"TeaInitModifyServlet?username<%username%>">修改信息</a><a href…

设施农业“AutoML“时代:大模型自动调参,让农业算法模型更简单易用

&#xff08;于景鑫 北京市农林科学院智能装备技术研究中心&#xff09;设施农业是现代农业的重要发展方向,但在数字化、智能化的进程中仍面临诸多挑战。传统的农业算法模型虽然可以为设施农业提供一定的决策支持,但在实际应用中往往受限于参数调优复杂、模型泛化能力差等因素。…

<Rust><iced>基于rust使用iced构建GUI实例:一个CRC16校验码生成工具

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第五篇实例,是一个CRC16校验码转换程序。 本篇内容: 1、CRC16校验码生成 代码介绍 本文的crc16校验码生成工具,主要设计两个方面,一个是crc16 modbus…

PADS Router 扇出失败问题详细解决方法。

第一步&#xff1a;确定单位是一致的,我的单位是 “密尔”&#xff0c;不是“公制”。 第二步&#xff1a;进去pads router 右键选择特性&#xff0c;注意&#xff0c;是右键点击任意板框内空白位置的特性&#xff0c;这个是涵盖整体的设置&#xff0c;和单独点击一个元器件选…

react-native从入门到实战系列教程一Swiper组件的使用及bug修复

轮播图&#xff0c;在app中随处可见&#xff0c;这么重要的功能我们怎么可能不学习下在react-native中的实现方式。 依然是第三方组件react-native-swiper 官网地址 https://www.npmjs.com/package/react-native-swiper 组件使用的组件及事件参考官方即可。 实现效果 官网…