本文首先了解几个基本的概念,如数据库、关系型数据库、数据表、字段等,然后讨论了如何通过HeidiSQL将CSV数据导入MySQL数据库中。
数据库(DB,database),也就是数据仓库,用于存储和管理数据;而MySQL、SQL Server等称为数据库管理系统(DBMS),在存储和管理数据的基础上又包括了更多的功能和工具,可以更加高效的处理和使用数据。在数据库管理系统中,一般可以有一个或多个数据库(或数据库实例)。
MySQL数据库的应用基于网络服务,称为网络数据库,可以使用客户端或开发组件连接服务器(地址和端口)进行操作。相对的称为“桌面数据库”,如Access、SQLite3等,操作这些数据库时,会直接读取本地的数据库文件。
操作MySQL数据库时,可以使用自带的mysql客户端,也可以使用其他第三方客户端软件,如上篇文章中介绍的HeidiSQL等。
接下来的内容并不刻意区分数据库和数据库管理系统的概念,但一般来讲,如提到MySQL则表示MySQL数据库管理系统;如果使用一个命名数据库,则是MySQL数据库管理系统中一个具体的数据库,如cdb_demo数据库。
关系型数据库中,数据的基本组织形式是二维表与各表之间的关系,并使用SQL语句进行操作,包括数据的定义和管理等。如MySQL、SQL Server、Access、SQLite3等就属于关系型数据库。
二维表的概念相信大家不会陌生,如Excel中的工作表就是典型的二维表格式;不同的是,Excel中的格式是按单元格设置的,而在数据库中,每个字段(列)的数据类型和其它属性需要在设计表结构时确定。
关系型数据库中,表和表之间是通过一系列的“键(key)”联系起来的,如下图所示。
图中包括“订单”和“订单详情”两个数据表,它们都包含了“订单号”字段(列),而这两个表的关系就是通过“订单号”进行关联。在“订单”表中包含了订单的主要信息,唯一的“订单号”字段定义为主键(PK,Primary Key);“订单详情”表中包含了每个订单的商品信息,其中每一个“订单号”可以包含多个商品信息,图中显示的关系也正是“一对多”,即一个订单可对应多个商品。
数据库中,数据表是保存数据的基本单位,是由字段、各种“键”等要素定义。在MySQL中创建数据表使用create table语句,基本语法如下:
create table <表名> (<字段定义>) engine=innodb default charset=utf8mb4;
其中,<字段定义>包含数据表中各字段(列)的定义,也就是确定了表的数据结构。之后的engine参数指定MySQL表的引擎类型,这里使用innodb;default charset参数指定数据表的默认编码,这里使用utf8mb4。
下面创建测试数据库和数据表,在HeidiSQL中连接到本地测试服务器,然后在“查询”中输入或粘贴如下代码。
create database cdb_demo default charset=utf8mb4; use cdb_demo; create table t1( recid bigint not null auto_increment primary key, f1 varchar(15) not null unique, f2 varchar(30) not null, f3 varchar(18), f4 bigint, f4a bigint, f4b bigint, f5 decimal(15,2), f5a decimal(15,2), f6 datetime )engine=innodb default charset=utf8mb4;
可以使用HeidiSQL工具栏中的“执行”按钮或键盘F9执行,代码会创建cdb_demo数据库,并在cdb_demo数据库中创建t1数据表,表中创建了recid、f1、f2、f3、f4、f4a、f4b、f5、f5a、f6共10个字段(列),使用了bigint、varchar、deicamal和datetime等数据类型。
下面导入一些测试数据,下载地址http://caohuayu.com/res/Res.aspx?id=res20251201。接下来,将测试数据中的“测试数据2.csv”文件中的数据导入到t1表中。通过HeidiSQL菜单“工具”>>“导入CSV文件”打开操作窗口,如下图所示,需要根据实际情况修改其中的设置。
本例需要注意的几个地方包括:
设置完成后点击“导入!”按钮执行导入,操作成功后可以通过如下语句查看导入的数据。
select * from cdb_demo.t1;
这里使用了select语句,*表示所有字段(列),from关键字指定数据源,这里使用了“<数据库>.<表>”的格式,指定数据源为cdb_demo数据库中的t1表。如果需要大量使用某个数据库中的对象,可以使用use语句引用数据库,如下面的代码可以完成相同的查询工作。
use cdb_demo; select * from t1;
下图显示了t1表中的部分数据。