轻松上手,快乐学习!

MySQL 教程

MySQL 首页MySQL 介绍MySQL 安装MySQL 实例库下载MySQL 实例库导入MySQL SELECTMySQL DISTINCTMySQL ORDER BYMySQL WHEREMySQL ANDMySQL ORMySQL INMySQL BETWEENMySQL LIKEMySQL LIMITMySQL IS NULLMySQL 别名MySQL JOINSMySQL INNER JOINMySQL LEFT JOINMySQL RIGHT JOINMySQL CROSS JOINMySQL SELF JOINMySQL GROUP BYMySQL HAVINGMySQL ROLLUPMySQL 子查询MySQL 派生表MySQL EXISTSMySQL CTEMySQL 递归 CTEMySQL UNIONMySQL INTERSECTMySQL MINUSMySQL INSERTMySQL INSERT INTO SELECTMySQL INSERT IGNOREMySQL UPDATEMySQL UPDATE JOINMySQL DELETEMySQL ON DELETE CASCADEMySQL DELETE JOINMySQL REPLACEMySQL PREPAREMySQL 事务MySQL 表锁定MySQL USEMySQL 数据库管理MySQL CREATE DATABASEMySQL DROP DATABASEMySQL 存储引擎MySQL CREATE TABLEMySQL 序列MySQL ALTER TABLEMySQL RENAME TABLEMySQL DROP COLUMNMySQL ADD COLUMNMySQL DROP TABLEMySQL 临时表MySQL TRUNCATE TABLEMySQL 数据类型MySQL NOT NULLMySQL Primary KeyMySQL Foreign KeyMySQL UNIQUEMySQL CHECKMySQL 字符集MySQL 排序规则MySQL 导入 CSVMySQL 导出 CSVMySQL 自然排序MySQL 基础

MySQL 存储过程

MySQL 存储过程介绍MySQL 存储过程实例MySQL 存储过程变量MySQL 存储过程参数MySQL 存储过程返回多值MySQL IF 语句MySQL CASE 语句MySQL IF CASE 选择MySQL 存储过程循环MySQL 存储过程游标MySQL 存储过程列表MySQL 存储过程异常处理MySQL SIGNAL 和 RESIGNALMySQL 存储函数

MySQL 视图

MySQL 视图教程SQL 视图介绍MySQL 视图介绍MySQL 创建视图MySQL 可更新视图WITH CHECK OPTIONLOCAL&CASCADEDMySQL 视图管理

MySQL 触发器

MySQL 触发器SQL 触发器MySQL 触发器介绍MySQL 触发器的创建MySQL 创建多个触发器MySQL 触发器管理MySQL 计划事件MySQL事件修改

MySQL 索引

MySQL 索引MySQL 索引创建MySQL 索引删除MySQL 显示索引MySQL 唯一索引MySQL 前缀索引MySQL 隐形索引MySQL 降序索引MySQL 复合索引MySQL 聚集索引MySQL 索引基数MySQL USE INDEXMySQL 强制索引

MySQL 管理

MySQL 管理MySQL访问控制系统MySQL 用户创建MySQL 用户密码MySQL 权限授予MySQL 权限撤销MySQL 角色MySQL 删除用户MySQL 表维护mysqldump 备份工具MySQL 数据库列表MySQL 表列表MySQL 表字段列表MySQL 用户列表MySQL 进程列表MySQL 列生成比较MySQL中同一表中的连续行

MySQL 全文搜索

MySQL 全文搜索MySQL 全文搜索介绍FULLTEXT索引MySQL 自然语言全文搜索MySQL 布尔全文搜索MySQL查询扩展MySQL ngram

MySQL 高级

MySQL 函数MySQL 窗口函数

MySQL 技巧

MySQL 查找重复数据MySQL 删除重复数据MySQL UUIDMySQL 表的复制MySQL 复制库MySQL 变量MySQL SELECT INTO 变量MySQL 表的存储引擎MySQL 使用正则查询MySQL 添加序号MySQL 随机查询MySQL 查询第 N 高记录MySQL 重置自增值MySQL VS MariaDBMySQL 间隔值MySQL 获取当天日期MySQL NULL 映射MySQL 注释理解MySQL EXPLAINMySQL 技巧介绍MySQL COUNTMySQL 数据分层MySQL 两表比较Mysql Like 优化

MySQL 窗口函数

MySQL CUME_DIST() 函数MySQL DENSE_RANK() 函数MySQL FIRST_VALUE 函数MySQL LAG() 函数MySQL LAST_VALUE() 函数MySQL LEAD 函数MySQL NTH_VALUE 函数MySQL NTILE 函数MySQL PERCENT_RANK 函数MySQL RANK 函数MySQL ROW_NUMBER 函数

MySQL 应用

MySQL应用程序编程接口PHP MySQL教程PHP 数据库连接

MySQL 优化

mysqld 内存持续变高


导入 CSV 文件到 MySQL Table


本教程介绍如何使用  LOAD DATA INFILE语句将CSV文件导入MySQL表。

LOAD DATA INFILE语句允许您从文本文件中读取数据,并将文件的数据快速导入数据库表。

在导入文件之前,您需要准备以下内容:

  • 准备好要导入文件数据的数据库表。
  • CSV文件中的数据与表的列数和每列中的数据类型相匹配。
  • 帐户具有FILE和INSERT权限。

假设我们有一个以discounts下列结构命名的表:

我们使用CREATE TABLE语句创建discounts表,如下所示:

CREATE TABLE discounts (
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    expired_date DATE NOT NULL,
    amount DECIMAL(10 , 2 ) NULL,
    PRIMARY KEY (id)
);

以下  discounts.csv文件包含第一行作为列标题和其他三行数据。

id,title,expired_date,amount
1,"Spring Break 2014",20140410,20
2,"Back to School 2014",20140901,25
3,"Summer 2014",20140825,10

以下语句将c:\tmp\discounts.csv文件中的数据   导入discounts表中。

LOAD DATA INFILE '/Users/rick/Downloads/discounts.csv' 
INTO TABLE discounts 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;

文件的字段由逗号表示,  FIELD TERMINATED BY ','并用ENCLOSED BY '"'' 指定的双引号括起来。

CSV文件的每一行都由指示的换行符终止LINES TERMINATED BY '\n'

因为文件具有包含列标题的第一行,不应将其导入表中,因此我们通过指定IGNORE 1 ROWS选项忽略它  。

如果在执行的过程中出现以下错误:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

我们可以使用如下命令查看配置:

mysql> show variables like '%secure%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| require_secure_transport | OFF   |
| secure_auth              | ON    |
| secure_file_priv         | NULL  |
+--------------------------+-------+
3 rows in set (0.01 sec)

我这里这个参数的值是null,说明mysql中就没有设置secure_file_priv这个选项。如果这个参数是个特定的文件路径,就说明文件只有在这个路径下才能将它导入导出到mysql。参数secure_file_priv的值及含义如下:

secure_file_priv值 含义
NULL 禁止文件的导入导出
‘’ (空字符串)允许所有文件的导入导出
一个特定的路径地址 只有该路径地址下的文件可以导入导出到mysql

解决此问题我们可以通过修改 my.cnf 配置文件:

#写在 my.ini 配置文件中
#允许导入文件
secure_file_priv=''

然后重启数据库

mysql> SHOW GLOBAL VARIABLES LIKE 'secure_%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_auth      | ON    |
| secure_file_priv |       |
+------------------+-------+
2 rows in set (0.00 sec)

现在我们再导入一次:


现在,我们可以检查discounts表以查看是否导入了数据。

SELECT * FROM discounts;
+----+---------------------+--------------+--------+
| id | title               | expired_date | amount |
+----+---------------------+--------------+--------+
|  1 | Spring Break 2014   | 2014-04-10   |  20.00 |
|  2 | Back to School 2014 | 2014-09-01   |  25.00 |
|  3 | Summer 2014         | 2014-08-25   |  10.00 |
+----+---------------------+--------------+--------+
3 rows in set (0.00 sec)

导入时转换数据

有时,数据的格式与表中的目标列不匹配。在简单的情况下,您可以使用SET语句中的子句  对其进行转换LOAD DATA INFILE

假设  discount_2.csv文件的到期日期列是  mm/dd/yyyy格式。

id,title,expired_date,amount
1,"Spring Break 2014",1/4/2014,20
2,"Back to School 2014",1/9/2014,25
3,"Summer 2014",25/8/2014,10

将数据导入discounts表时,我们使用str_to_date() 函数将其转换为MySQL日期格式,如下所示:

LOAD DATA INFILE 'c:/tmp/discounts_2.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(title,@expired_date,amount)
SET expired_date = STR_TO_DATE(@expired_date, '%m/%d/%Y');

将文件从客户端导入到远程MySQL数据库服务器

可以使用LOAD DATA INFILE语句将数据从客户端(本地计算机)导入到远程MySQL数据库服务器。

当您使用  LOCAL选项时  LOAD DATA INFILE,客户端程序将读取客户端上的文件并将其发送到MySQL服务器。文件将上载到数据库服务器操作系统的临时文件夹中,例如,  C:\windows\temp在Windows或  /tmpLinux上。此文件夹不可由MySQL配置或确定。

我们来看看下面的例子:

LOAD DATA LOCAL INFILE  'c:/tmp/discounts.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

唯一的区别是LOCAL声明中的选项。如果加载一个大的CSV文件,您将看到使用  LOCAL选项,加载文件会慢一点,因为将文件传输到数据库服务器需要一些时间。

使用LOCAL选项时,连接到MySQL服务器的帐户不需要具有FILE权限即可导入文件。

使用您应注意的LOAD DATA LOCAL一些安全问题将文件从客户端导入到远程数据库服务器  以避免潜在的安全风险。

我们已经向您展示了如何 LOAD DATA LOCAL使用MySQL Workbench 将CSV导入MySQL表。使用这些技术,您可以从其他文本文件格式(如制表符分隔)加载数据。