10.1.0前言
前面我们已经对用户操作以及库,表操作有了基础的认识,接下来我们来在之前已经学过的一些操作进行进一步拓展,本章我们主要了解以下几个知识点:
- 数据库设计方法
- 视图
- 存储过程
- 事务
我们开始本章的内容吧
10.2 数据库设计方法
(注意:本小节仅仅带大家做一个了解)
前面我们在第七章的时候曾经提到过,数据库分为两种:
- 关系型数据库
- 非关系型数据库
而我们之前也提了一嘴,关系型数据库(是一个结构化数据库,通过关系模型来组织数据的数据库)。而这种关系模型被称为E-R模型(Entity-Relationship Model)实体-联系模型。
(在这里我们对er关系模型进做一个简单的了解,了解目的仅仅为了通过E-R模型将两个表进行主外键关联,因此我们不会过多赘述,希望各位读者见谅!)
E-R模型基本元素:
- 实体
- 属性
- 标识符
- 联系
这里我们设想做一个设想:
- 实体就相当于表中的全部数据
- 属性就相当于表中字段
- 标识符可以理解为主键外键
- 联系的话就相当于表与表之间的联系
而表与表之间的联系类型又可以分为下面几种类型:
- 一对一
- 一对多
- 多对多
这里我们只用一对一联系举例,其他联系的话建议点击下面链接
数据库设计之E-R模型
我们只需要知道,我们是通过一个主键和一个外键将表与表进行连接。
这里我们要扩展一个小知识了:
- 主键:是用于在表中唯一的标识一个字段
- 外键:外键是另外一个表主键,通过使用外键,可以将两个表关联起来
这里需要注意:
外键和外键可以进行连接,外键和主键也可以进行连接,主键和主键之间也可以进行连接。但是这里需要注意的是,主键和主键连接过程中,会默认将前表设为主表,两个表的全部内容都显示出来,形成一个自然连接。
这里可能就有同学有疑问了,我们通过链接查询就可以获取连接结果了,为什么还要使用这个联接呢?这离我们要知道的是,链接查询仅仅是我们所认为可以联合的链接,计算机并不会认为可以形成链接。而在该方法中,是数据库通过表与表进行连接,该链接一般来讲不会轻易丢失!!!
我们现在看一下连接格式
foreign key (字段名) references 表名2(字段名)
我们举个例子来看一下具体如何联系
我们先创建一个表tb2,创建格式如下
create table tb2( classid int primary key, name char(30));
然后创建表tb1,并与tb2通过classid进行链接。使用以下命令
create table tb1( id int primary key, name char(30), classid int, foreign key(classid) references tb2(classid))
我们来看结果
连接成功
因为能力有限,笔者也仅仅让各位了解一下这个功能,如果想了解更多关于E-R模型和表结构的知识,可以查看点击下面链接进行进一步学习
关系型数据库与非关系型数据库
MYSQL数据库主键和外键,内连接和外连接,关联子查询
数据库设计之 E-R 模型
10.3 视图
前面我们在进行用户授权时我们知道,在对用户进行授权时我们会给他们一整张表的所有权限,而在工作中我们可能只需要给这张表的部分权限授权给用户,这个时候我们就要用到视图了。
视图是什么?
- 视图可以认为是一张表
- 但是这表表存在内存中的虚表,断电后会消失
视图的作用:
通过视图,可以让用户只能访问数据库中一部分数据(需要给用户授权查看视图权限!)
说白了,就是让目标用户只能看到给定表中的给定的数据,并且该表存在于内存中,断电就丢失。
我们直接来看格式
创建视图格式:
create view 视图名 as select 语句
还是老规矩,举例演示一下
现有表scores,表中数据如下
我们创建一个视图stuid3,要求只能查看stuid为三的视图
create view stuid3 as select * from scores where stuid=3
我们来看一下创建好的视图
ok,视图没毛病,接下来我们给用户jerry进行授权,让他可以查看该视图
grant all on hellodb.stuid3 to "jerry"@"localhost" identified by "123456"
接下来我们来看一下jerry视角
表中没数据,视图中可以查看,没毛病。下一个
10.4 调用/使用存储过程
这个东西类似于其他计算机语言的函数,通过写一些简单的脚本存放在存储过程命中,使用时进行调用,一般用于想数据库内快速写入大量数据。
我们还是先来看一下格式:
定义存储过程格式:
delimiter // #存储过程的开头,定义一个符号 create procedure 存储过程程() #定义存储过程名字 begin sql语句 end //
调用/使用存储过程的格式:
call 存储过程名()
接下来我们举例来看理解这个东西
现有表tb1,表结构如下
现在我们通过存储过程向表中插入一千条数据:
命令格式及每行语义如下
delimiter // #定义开头 create procedure m3() #创建存储过程,m3 begin #开始存储过程 declare i int; #declare定义变量i,类型是整型 set i = 0; #设置将i的值为0 while i<1000 do #当i小于1000是执行循环 insert into tb1(id) values(i); #向表中插入数据 set i = i + 1; #将i的值加1 end while; #循环结束 end // #定义结束 delimiter;
我们开始调用该存储过程
call m3()
我们开始看结果
id从0到999,插入了一千条数据,证明程序成功
注意:在使用数据存储中,必须将定义存储过程写在调用数据存储过程的上方,否则会运行不起来!!!
10.5 事务
事务,说白了就是将数据库的多个命令放到一起进行运行,从而能一下子做好多事情。具体特点如下:
- 将多个sql语句组合成一个整体,这个整体就是一个事物
- 事物中的所有语句要么都执行,要么都不执行
- 通过使用事物,可以保证数据的一致性
事务有以下两个操作:
启动事务 提交事物- 回滚事物
启动事务
先启动事务才能执行操作,启动事务命令如下:
begin
提交事务
在启动事务之后,我们写完命令就可以通过提交命令对事务进行提交以便进行数据执行。数据执行的命令如下:
commit
在执行提交事务时需要注意以下几点:
- 让事物中的sql语句,真正的生效
- 如果使用了事物,那么在事物提交之前,其他用户是看不到事务中的操作的
在使用提交事务之后,我们会发现难免会有一些sql语句没有执行成功,因此,为了保持数据的一致性,我们可能要重新检查命令去执行,因此我们要用到事务的回滚操作
事务回滚:
- 事务中的语句,如果只有部分执行成功,那么就需要将这个事物进行回滚操作
- 回滚:将数据恢复到执行之前的状态
说白了,这个命令类似于游戏中的重新开始,丢失全部数据,重新通过事务进行提交,从而保持数据的一致性。
回滚事务格式
rollback
(这里我们专业不是很常用,因此我们仅仅做了解,如需要了解详细内容请查看下面博客)
MySQL事务(transaction) (有这篇就足够了..)
好了,MySQL到这里为止就讲完了,接下来我们将将继续深入Linux,创作过程中难免有些问题,如有不足,请指正。最后感谢各位的观看,我们linux见!!0v0