📜  MySQL在数据库/表中导入CSV文件

📅  最后修改于: 2020-11-19 00:44:08             🧑  作者: Mango

MySQL在数据库/表中导入CSV文件

如何在MySQL数据库或表中导入CSV文件?

MySQL具有允许我们将CSV文件导入数据库或表的功能。 CSV代表以逗号分隔的值,这是一个纯文本文件,包含数据列表,并允许我们以表格格式保存它。它主要用于在不同应用程序之间交换数据。有时也称为字符分隔值。通常,它与逗号字符一起使用来定界(分隔)数据,但也可以使用其他字符,例如分号。

当我们需要将复杂数据从一个应用程序导出到CSV文件,然后将文件数据导入另一个应用程序时,此文件非常有用。我们可以将CSV文件与各种电子表格程序(例如MS Excel或Google Spreadsheets)一起使用。 CSV文件不允许以这种格式保存公式。

CSV文件的结构

CSV文件的结构包含由逗号运算符分隔的数据列表。例如,以下数据结构对其进行了更清晰的说明:

Name, Email, Mobile, Address

Jorge Stephen, jorge@javatpoint.com, 546-329-9876, 123 Park Street

Peter, peter@javatpoint.com, 123-786-5678, 321 Fake Avenue

要导入CSV文件,我们将使用LOAD DATA INFILE语句。该语句用于读取文本文件并将其快速导入数据库表中。

在将文件导入数据库表之前,我们必须确保以下几点:

  • 一个空表,将从文件中导入数据。
  • 一个CSV文件,该文件与表的每一列的顺序,列数和数据类型相匹配。
  • 在MySQL中与数据库服务器连接的用户帐户具有FILE和INSERT特权。

假设我们有一个名为mytestdb的数据库。现在,我们将使用以下查询在此数据库中创建一个名为Address_Book的空表:

CREATE TABLE Address_Book (
    ID int NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    Name varchar(35) NOT NULL, 
    Email varchar(35),
    Mobile varchar(15), 
    Address varchar(45)
);

现在,我们可以使用可以在以下输出中显示的SELECT语句来验证新创建的表是否为空:

接下来,我们将创建一个CSV文件。以下address_book.csv文件包含第一行作为列标题,其他行是要插入表中的数据。

ID, Name, Email, Mobile, Address
1, "Jorge Stephen", "jorge@javatpoint.com", "546-329-9876", "123 Park Street"
2, "Peter", "peter@javatpoint.com", "123-786-5678", "321 Fake Avenue"
3, "Michael Clark", "clark@javatpoint.com", "543-346-5988", "321 Park Avenue"
4, "James Franklin", "james@javatpoint.com", "890-798-5448", "321 Fake Avenue"

最后,以下语句允许我们将数据从address_book.csv导入到address_book表。

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/address_book.csv' 
INTO TABLE address_book 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n' 
IGNORE 1 ROWS;

从上面

文件位置:它指定CSV文件在系统中的位置。

FIELD TERMINATED BY',':用来表示文件的字段,以逗号结尾。

ENCLOSED BY'“':用于指定文件中用双引号引起来的字段。

'\ r \ n'终止的行:用于终止CSV文件的每一行。

IGNORE 1 ROWS:它用于忽略CSV文件的第一行,该文件具有不需要导入表中的列标题。

现在,我们可以使用SELECT语句来验证新创建的表是否被导入的数据填充,该语句可以在下面的输出中显示。

导入时转换数据

有时,将CSV文件导入数据库表时,数据格式与表中的相应列不匹配。在这种情况下,我们可以通过将SET子句与LOAD DATA INFILE语句一起使用来转换该列。

假设CSV文件的日期列格式为“ dd / mm / yy”,并且与导入时目标表的相应列不匹配。为了克服这个问题,我们需要使用STR_TO_DATE()函数将其转换为MySQL日期格式,如下所示:

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/address_book.csv' 
INTO TABLE address_book 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n' 
IGNORE 1 ROWS
(Mobile,@Date,Address)
SET Date = STR_TO_DATE(@Date, '%m/%d/%Y');

将CSV文件从客户端导入MySQL服务器

LOAD DATA INFILE语句还允许我们从客户端(本地系统)导入CSV文件到远程MySQL Server。

当我们在LOAD DATA INFILE语句中添加LOCAL子句时,客户端程序可以读取本地系统上的CSV文件并将其发送到MySQL数据库服务器。然后,此文件将被上载到数据库服务器操作系统的临时文件夹,例如Windows上的C:\ windows \ temp和Linux OS上的/ tmp。这些文件夹不是由MySQL确定或配置的。

以下语句对其进行了更清晰的说明:

LOAD DATA LOCAL INFILE 'C:/windows/temp/address_book.csv' 
INTO TABLE address_book 
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n' 
IGNORE 1 ROWS;

在上面,我们可以看到我们仅在语句中添加了LOCAL选项。但是,在使用LOCAL选项导入大型CSV文件时,会使文件加载速度变慢。这是因为此选项花费时间在数据库服务器上传输文件。

当我们使用LOCAL选项时,MySQL用户帐户不需要具有导入文件的FILE特权。

从本地导入文件到远程服务器时,LOAD DATA LOCAL INFILE语句存在一些安全问题。在这种情况下,我们应该意识到避免潜在的安全风险。

使用MySQL Workbench导入CSV文件

MySQL Workbench有一个内置工具,可让我们将CSV文件数据导入表中。它还可以帮助我们在更改数据库或表之前编辑数据。

以下是显示将CSV文件数据导入数据库表的步骤:

步骤1:首先,我们需要在所需的数据库中创建一个表。它可以确保表格的列数与CSV文件中的列数相同。假设我们有一个名为“ address_book”的表,该表不包含下图所示的任何数据:

第2步:打开表格后,我们可以使用下方屏幕红色框中显示的导入按钮导入文件。

单击导入按钮,它将弹出窗口屏幕,我们需要选择一个CSV文件,然后单击下一步按钮。

步骤3:在下一个向导中,我们需要选择目标表,然后单击“下一步”按钮。在这里,我们有两个选择:一个是使用现有表,或者我们可以创建一个新表。

步骤4:在下一个向导中,我们需要配置导入设置,然后单击Next(下一步)。

步骤5:在下一个向导中,我们必须监视执行过程,然后单击Next-> Next> Finish完成该过程。

第6步:我们可以通过执行SELECT查询来验证是否成功导入了数据。

注意:通过上述技术,我们还可以从其他文本文件格式加载数据。