数据存储过程

MySQL 中,一个完整数据存储过程分为四步:创建数据库 - 确认字段 - 创建数据表 - 插入数据。

从系统架构层次来看,MySQL 数据库系统从大到小依次是数据库服务器、数据库、数据表、数据表的行与列。

数据库是 MySQL 最大的存储单元,没有数据库,数据表就没有载体,也就无法存储数据。

准备工作

安装数据库

docker run -d -p 3306:3306 \d
    --net=host \
    -e MYSQL_ROOT_PASSWORD=password \
    -v /data/main-mysql:/var/lib/mysql \
    -v /etc/localtime:/etc/localtime \
    --name=main-mysql \
    mysql:8.0
bash
docker run -d -p 3306:3306 --net=host -e MYSQL_ROOT_PASSWORD=password -v /data/main-mysql:/var/lib/mysql -v /etc/localtime:/etc/localtime --name=main-mysql mysql:8.0
bash

连接数据库

mysql –u用户名 [–h主机名或者IP地址,-P端口号] –p密码
docker exec -it main-mysql /bin/bash

mysql -uroot -ppassword
bash

创建数据库

数据存储的第一步,就是创建数据库。

创建数据库

CREATE DATABASE demo;

创建数据库无权限处理方法如下:

show grants;

grant all privileges on *.* to 'root'@'%' identified by 'your passsword' with grant option;

flush privileges;
bash

查看数据库

SHOW DATABASES;
  • “demo”:我们通过 SQL 语句创建的数据库,用来存储用户数据。
  • ”information_schema“ :系统自带数据库,主要保存 MySQL 数据库服务器的系统信息。
    • 比如如数据库名称、数据表名称、字段名称、存取权限、数据文件所在的文件夹和系统使用的文件夹,等等。
  • ”performance_schema“ :系统自带数据库,可以用来监控 MySQL 的各项性能指标。
  • ”sys“ 数据库是 MySQL 系统自带的数据库,主要作用是以一种更容易被理解的方式展示 MySQL 数据库服务器的各类性能指标,帮助系统管理员和开发人员监控 MySQL 的技术性能。
  • ”mysql“ :系统自带数据库,用来保存 MySQL 数据库服务器运行时需要的系统信息。
    • 比如数据文件夹、当前使用的字符集、约束检查信息,等等。

如果你是 DBA 或者 MySQL 数据库程序员,想深入了解 MySQL 数据库,可以查看官方文档

确认字段

数据存储流程的第二步是确认表的字段。

MySQL 数据表由行与列组成,一行就是一条数据记录,每一条数据记录都被分成许多列,一列就叫一个字段。

每个字段都需要定义数据类型,这个数据类型叫做字段类型。

创建数据表

数据存储流程的第三步,是创建数据表。

创建数据表

CREATE TABLE
    demo.test (
        barcode text,
        goodsname text,
        price int
    );
  • 创建数据表,最好指明数据库。
  • 最后一个字段后面不需要加逗号 ”,“

查看表结构

DESCRIBE demo.test;
mysql> DESCRIBE demo.test;
+-----------+------+------+-----+---------+-------+
| Field     | Type | Null | Key | Default | Extra |
+-----------+------+------+-----+---------+-------+
| barcode   | text | YES  |     | NULL    |       |
| goodsname | text | YES  |     | NULL    |       |
| price     | int  | YES  |     | NULL    |       |
+-----------+------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • Field:表示字段名称
  • Type:表示字段类型
  • Null:表示字段是否允许空值(NULL)
    • 在 MySQL 中,空值不等于空字符串。一个空字符串的长度为 0,一个空值的长度是空。
    • 在 MySQL 中,空值也占用空间。
  • Key:表示键
  • Default:表示默认值
    • 我们创建的数据表字段都允许为空,默认值都是 NULL
  • Extra:表示附加信息

查看表

USE demo;
SHOW TABLES;
mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| test           |
+----------------+
1 row in set (0.00 sec)

设置主键

一个 MySQL 数据表只能有一个主键,主键可以确保数据唯一性。

虽然 MySQL 允许创建没有主键的表,但是建议一定要给表定义主键,并且养成习惯。因为主键可以帮助你减少错误数据,并且可以提高查询速度。

MySQL 中的主键,是表中的一个字段或者几个字段的组合。它有 3 个特征:

  • 必须唯一,不能重复;
  • 不能为空;
  • 必须可以唯一标识数据表中的记录。

我们的表中有三个字段 barcode、goodsname、price,那么哪个字段可以作为主键呢?

首先商品名称(goodsname)是不行的,原因是重名的商品会有很多。例如 ”笔“,大家都可以生产一种叫 ”笔“ 的商品,各种各样的,不同规格的,不同材料的。商品名称和数据记录之间并不能形成一一对应的关系,所以商品名称不能作为主键。同样,价格(price)重复的可能性也很大,也不能做主键。

商品条码(barcode)也不能是主键。可能你会说,商品的条码都是由中国物品编码中心统一编制的,一种商品对应一个条码,一个条码对应一种商品。这不就是一一对应的关系?在实际操作中,存在例外的情况。比较典型的就是用户的门店里面有很多自己生产或者加工的商品。例如,馒头、面条等自产产品,散装的糕点、糖果等称重商品,等等。为了管理方便,门店往往会自己给它们设置条码。这样,很容易产生重复、重用的现象。

这时,就需要我们自己添加一个不会重复的字段来做主键。

我们可以添加一个字段,字段类型是整数,可以取名为商品编码(itemnumber)。当我们每次增加一条新数据库的时候,可以让这个字段值自增,这样就永远都不会重复了。

我们可以通过一条 SQL 语句,修改表结构,增加一个主键字段:

ALTER TABLE demo.test
ADD
    COLUMN itemnumber int PRIMARY KEY AUTO_INCREMENT;
mysql> ALTER TABLE demo.test
    -> ADD
    ->     COLUMN itemnumber int PRIMARY KEY AUTO_INCREMENT;
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0
  • alter table:表示修改表;
  • add column:表示增加一列;
  • primary key:表示这一列是主键;
  • auto_increment:表示增加一条记录,这个值会自动增加。
mysql> DESCRIBE demo.test;
+------------+------+------+-----+---------+----------------+
| Field      | Type | Null | Key | Default | Extra          |
+------------+------+------+-----+---------+----------------+
| barcode    | text | YES  |     | NULL    |                |
| goodsname  | text | YES  |     | NULL    |                |
| price      | int  | YES  |     | NULL    |                |
| itemnumber | int  | NO   | PRI | NULL    | auto_increment |
+------------+------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

插入数据

数据存储流程的第四步,也是最后一步,是把数据插入到表当中去。

INSERT INTO
    demo.test (barcode, goodsname, price)
VALUES ('001', '本', 3);
mysql> INSERT INTO
    ->     demo.test (barcode, goodsname, price)
    -> VALUES ('001', '', 3);
Query OK, 1 row affected (0.01 sec)

insert into 表示向 demo.test 中插入数据,后面是要插入数据的字段名,values 表示对应的值。

注意点:

  • 插入数据的字段名可以不写,建议每次都写。这样做的好处是可读性好,不易出错且容易修改。
  • 由于字段 itemnumber 定义了 auto_increment,所以我们插入一条记录的时候,不给它赋值,系统也会自动赋值,每次赋值自增 1。也可以在插入数据的时候给 itemnumber 赋值,但是必须保证与已有记录的 itemnumber 值不同,否则就会提示错误。

总结

我们在进行具体操作时,会用到 8 种 SQL 语句:

-- 创建数据库
CREATE DATABASE demo;
-- 删除数据库
DROP DATABASE demo;
-- 创建数据表
CREATE TABLE
    demo.test (
        barcode text,
        goodsname text,
        price int
    );
-- 查看表结构
DESCRIBE demo.test;
-- 查看所有表
SHOW TABLES;
-- 添加主键
ALTER TABLE demo.test
ADD
    COLUMN itemnumber int PRIMARY KEY AUTO_INCREMENT;
-- 向表中添加数据
INSERT INTO
    demo.test (barcode, goodsname, price)
VALUES ('001', '本', 3);

最后,我们再来了解一下 MySQL 种 SQL 语句的书写规范。

MySQL 以分号来识别一条 SQL 语句结束,所以,你写的每一条 SQL 语句的最后,都必须有一个分号,否则,MySQL 会认为这条语句没有完成,提示语法错误。

所以,建议在写 SQL 语句时遵循统一的样式,以增加可读性,减少错误。可以点击这个链接深入学习相关规范。