MySQL 快速导入数据指令load Data 详解

这篇具有很好参考价值的文章主要介绍了MySQL 快速导入数据指令load Data 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方文档
https://dev.mysql.com/doc/refman/8.0/en/load-data.html

样例

LOAD DATA
[LOW_PRIORITY | CONCURRENT] [LOCAL]
INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var
[, col_name_or_user_var] ...)]
[SET col_name={expr | DEFAULT}
[, col_name={expr | DEFAULT}] ...]

LOCAL:是否导入本地电脑文本文件,

导入本地电脑文件:一定要启用 local_infile 参数,否则会报错。
导入非本地电脑文件:用户一定要 FILE 权限,secure_file_priv参数值如果不为空,则文件一定要在这个目录中,如果为空,则该文件只需服务器可读。

我本地使用mysql8.023客户端,在一切条件符合的情况下,LOAD DATA数据报错.
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 ;
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

排错一圈,才发现踩了mysql8的一个bug,
https://bugs.mysql.com/bug.php?id=91872

  • 解决方法:
    在client端配置文件中加入
[client]
loose-local-infile = 1
[mysqld]
local_infile=1

然后再在使用mysql命令行时,指定 loose-local-infile = 1 连接数据库

mysql --local-infile=1 -uroot -p123456 -P3306 -h1.1.1.1

[REPLACE | IGNORE]:如遇到唯一冲突重复处理机制

REPLACE:覆盖写。
IGNORE:忽略。
如果没有指定REPLACE, IGNORE或者LOCAL,当发生错误时,会报错,并且文本余下部分不会被执行。

示例:

mysql> load data infile '/root/1.csv' into table ceshi.t1 ;
ERROR 1265 (01000): Data truncated for column 'id' at row 2

提示:如果要在加载数据中忽略外键约束,需要在Load data 数据之前执行SET foreign_key_checks = 0

如果没有指定 FIELDS 或 LINES 子句,则默认值如下
FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ‘’ ESCAPED BY ‘\’
LINES TERMINATED BY ‘\n’ STARTING BY ‘’
提示:在 WINDOWS 系统中,想要正确的读文件需要配置 LINES TERMINATED BY ‘\r\n’,因为WINDOWS系统通常使用两个字符做为终止符。

CHARACTER SET charset_name

设置导入内容的字符集,默认采用character_set_database系统变量值字符集导入内容。
提示:
这里我踩了一个坑,我本地使用CRT连接数据库,不知为何客户端字符集是latain1了,文本中包含中文,如果以默认方式导入会出现乱码。一般情况下,不需要指定CHARACTER SET

示例:

root# cat 1.csv
1,chai
2,测试
mysql> show variables like '%character%'
-> ;
+--------------------------+------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql57/share/charsets/ |
+--------------------------+------------------------------------+
8 rows in set (0.07 sec)
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\\';
Query OK, 2 rows affected (0.15 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | chai |
| 2 | ?? |
+----+------+
2 rows in set (0.06 sec)
set names utf8;
再查询就正常了
mysql> select * from t1;
+----+----------------+
| id | name |
+----+----------------+
| 1 | chai |
| 2 | 测试 |

FIELDS TERMINATED BY:指定两列之间分隔符,

默认是\t ,也就是跳格,但大多时候生成的文本文件都是’,'逗号,所以在导入数据时,需要显式指定。

示例:

root# cat 1.csv
1,chai
2,测试
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',';
Query OK, 2 rows affected (0.20 sec)
Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+--------+
| id | name |
+----+--------+
| 1 | chai |
| 2 | 测试 |
+----+--------+
2 rows in set (0.09 sec)

ENCLOSED BY:去掉字符串中包裹的符号

示例:

root #cat 1.csv
1,chai
2,测试
3,""chayicha"
4,"chayige"

如果以之前的参数导入,则结果如下,里边的引号也会写入进去。

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',';
Query OK, 4 rows affected (0.16 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | chai |
| 2 | 测试 |
| 3 | ""chayicha" |
| 4 | "chayige" |
+----+-------------+
4 rows in set (0.05 sec)

##加入 ENCLOSED BY ‘"’ 参数后,在导入时字符左右两则的双引号被删掉了。

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
Query OK, 4 rows affected (0.13 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+-----------+
| id | name |
+----+-----------+
| 1 | chai |
| 2 | 测试 |
| 3 | "chayicha |
| 4 | chayige |
+----+-----------+

ESCAPED BY:设置转义字符,默认为\ 。

示例:

root#cat 1.csv
1,chai
2,测试
3,"\tchayicha"
4,wo\\a\\b\\c\tchayige
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\';
Query OK, 4 rows affected (0.13 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+------------------+
| id | name |
+----+------------------+
| 1 | chai |
| 2 | 测试 |
| 3 | chayicha |
| 4 | wo\a\b\c chayige |
+----+------------------+

LINES STARTING BY:忽略一个公共前缀,

如示例,只有以 cha 开头的记录正确写入到了数据库,这个参数应该不常用

示例:

root#cat 1.csv
cha1,chai
2,测试
cha3,"yicha"
4,chayige
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
ESCAPED BY '\\' LINES STARTING BY 'cha';
Query OK, 3 rows affected, 2 warnings (0.14 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 2
mysql> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 1 | chai |
| 3 | yicha |
| 0 | NULL |
+----+-------+

LINES TERMINATED BY ‘string’:分行符,

一般情况下遇到回行即分行 (\r\n)

示例:

演示一次遇到句号()即换行符
root#cat 2.csv
a,chai。2,测试。3,chayicha。
mysql> load data local infile '/Users/2.csv' into table ceshi.t1 
FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
ESCAPED BY '\\' LINES TERMINATED BY '。';
Query OK, 4 rows affected, 4 warnings (0.15 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 4
mysql> select * from t1;
+----+----------+
| id | name |
+----+----------+
| 0 | chai |
| 2 | 测试 |
| 3 | chayicha |
| 0 | NULL |
+----+----------+
4 rows in set (0.07 sec)

IGNORE number {LINES | ROWS}:跳过开始的多少行才进行导入,

如果文本中有字段名,可以跳过第一行.

示例:

root# cat 1.csv
1,chai
2,测试
3,"yicha"
4,chayige
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
1 LINES;
Query OK, 3 rows affected (0.13 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+---------+
| id | name |
+----+---------+
| 2 | 测试 |
| 3 | yicha |
| 4 | chayige |
+----+---------+

[(col_name_or_user_var [, col_name_or_user_var] …)]:手动指定要插入的列

示例:

root# cat 1.csv
1,chai
2,测试
3,"yicha"
4,chayige
mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
1 LINES(id,name);
Query OK, 3 rows affected (0.16 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 2 | 测试 | NULL |
| 3 | yicha | NULL |
| 4 | chayige | NULL |
+----+---------+------+
3 rows in set (0.09 sec)

[SET col_name={expr | DEFAULT} [, col_name={expr | DEFAULT}] …]:在加载数据时做一些计算或更新一些其它字段值。

示例:

root# cat 1.csv
1,chai
2,测试
3,"yicha"
4,chayige

#在写入数据时,更新age字段列

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
-> 1 LINES(id,name) set age=10;
Query OK, 3 rows affected (0.13 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+---------+------+
| id | name | age |
+----+---------+------+
| 2 | 测试 | 10 |
| 3 | yicha | 10 |
| 4 | chayige | 10 |
+----+---------+------+
3 rows in set (0.07 sec)

#在写入数据时对数据做二次逻辑处理

mysql> load data local infile '/Users/1.csv' into table ceshi.t1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' IGNORE
-> 1 LINES(id,@name) set name=concat(@name,1);
Query OK, 3 rows affected (0.14 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from t1;
+----+----------+------+
| id | name | age |
+----+----------+------+
| 2 | 测试1 | NULL |
| 3 | yicha1 | NULL |
| 4 | chayige1 | NULL |
+----+----------+------+
3 rows in set (0.07 sec)

最后贴一个成功案例文章来源地址https://www.toymoban.com/news/detail-782625.html

load data local infile 'D:\\34178517.csv' 
into table `finance_new`            
fields terminated by ','  
 enclosed by '"'        
lines terminated by '\n'
ignore 1 lines
(@id,`uuid`, `buyer_type`, `buyer_account`, `vendor_code`, `vendor_name`, `vendor_short_name`, `policy_no`, `order_id`, `biz_id`, `parent_biz_id`, `biz_line`, `biz_type`);
# 忽略第一行和id字段不赋值,因为表头已建好

到了这里,关于MySQL 快速导入数据指令load Data 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 数据库导入命令 SOURCE 详解

    在 MySQL 数据库中,可以使用 SOURCE 命令来执行 SQL 脚本文件,并将其内容导入到当前数据库中。这是一个非常有用的命令,特别是当需要导入大量数据或者执行复杂的数据库操作时。本文将详细介绍 SOURCE 命令的使用方法,并提供相应的源代码示例。 使用 SOURCE 命令导入 SQL 脚

    2024年02月03日
    浏览(47)
  • 【MySQL】将 CSV文件快速导入 MySQL 中

    一般来说,将csv文件导入mysql数据库有两种办法: 使用 navicat、workbench 等软件中的导入向导手动导入; 使用 load data infile 命令导入 前者速度较慢,适合数据量比较小的时候,而对于大文件,我们需要使用命令行导入。 打开安装好的Navicat Premium,连接数据库。 成功连接后如下

    2024年02月05日
    浏览(32)
  • 千万行csv大文件快速导入mysql

    最近尝试csv文件导入,因为之前太菜就用普通图形窗口导入,但是速度很慢,于是做了总结: 目前我这里一共两种方法: 一.图形化 图形化界面,找到电脑左下角的开始,找到wokbench 这个可视化软件,没有的是当初安装mysql没有下载他的可视化捆绑程序,自己可以百度解决。

    2024年02月05日
    浏览(36)
  • mysql:Error 3948 (42000): Loading local data is disabled; this must be enabled on both the client an

    上面图片是AI创作,未经允许,不可商用哦!如有更多需要,可私戳! 执行项目过程中意外出现的报错,之前也没有遇到过 报错信息如下: 翻译如下: 看报错信息感觉是和数据库有一定关系,网上搜索该错误,也都直指mysql中的一个参数: local_infile 需要指定该参数为开启状

    2024年02月02日
    浏览(38)
  • MySQL运维10-MySQL数据的导入导出

    MySQL数据的导入导出方案通常是配套的,例如: 方案一:使用mysqldump导出数据,再使用mysql客户端导入数据 方案二:使用SELECT INTO OUTFILE命令导出数据,再使用LOAD DATA或mysqlimport导入数据 方案三:使用mysql程序的批处理模式导出数据,再使用LOAD DATA或mysqlimport导入数据 1.1.1、使

    2024年02月06日
    浏览(49)
  • 『MySQL快速上手』Centos 7安装MySQL详解

    说明 : 在环境安装中始终保持 root 身份; 以下为 Centos 7 安装 MySQL 的详细步骤。若在安装过程中,本文章有未提及的地方,请私信我~ 为了确保你的机器上是否自带MySQL或者你曾经是否手动安装过MySQL,我们需要先进行检查。如果你曾经自己下载过某个版本的MySQL并且感觉不错

    2024年02月12日
    浏览(88)
  • [mysql]数据迁移之data目录复制方法

    1、简述: mysql数据迁移有多种方式,最常见的就是先把数据库导出,然后导入新的数据库。拷贝数据目录data是另外一种方式。 尤其是当数据库启动不了,或者大型数据库迁移的时候,可以考虑这个方式。 2、场景: 从老的mysql( mysqlA )迁移到新的mysql( mysqlB )。mysqlA对应

    2024年02月15日
    浏览(44)
  • 『MySQL快速上手』-①-Centos 7安装MySQL详解

    说明 : 在环境安装中始终保持 root 身份; 以下为 Centos 7 安装 MySQL 的详细步骤。若在安装过程中,本文章有未提及的地方,请私信我~ 为了确保你的机器上是否自带MySQL或者你曾经是否手动安装过MySQL,我们需要先进行检查。如果你曾经自己下载过某个版本的MySQL并且感觉不错

    2024年02月05日
    浏览(40)
  • MySQL数据库简单指令

    1. 启动MySQL服务: net start mysql 2. 进入MySQL: mysql -u root -p 3. 查看MySQL信息: s 4. 修改MySQL密码: ALTER USER root@localhost IDENTIFIED BY \\\'新密码\\\'; 5. 显示MySQL下所有数据库: show databases; 6. 退出MySQL: exit; 或者 Crtl+Z 7. 停止MySQL服务: net stop mysql 8. 创建数据库: create database 数据库名字

    2024年02月04日
    浏览(48)
  • MySQL导入/导出数据

    1、mysql 命令导入 使用 mysql 命令导入语法格式为: your_username、your_host、your_port、your_database 分别为你的 MySQL 用户名、主机、端口和数据库。 实例: 以上命令将将备份的整个数据库 runoob.sql 导入。 执行上述命令后,系统将要求输入 MySQL 用户的密码。输入密码并按Enter键。 这

    2024年02月20日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包