数据库四

Posted on 2019-03-20 19:13  杜卡迪S11  阅读(89)  评论(0)    收藏  举报

一、视图***

视图是一条SQL语句的查询结果所构成的虚拟表

并不是物理存在的,使用方式与普通表相同

视图的作用:简化了SQL语句的缩写;

      限制可查询的数据(可以使用权限来完成,权限到某一个库的某一个表的某一个字段)

视图的特点:对于限制的增删改查都会同步到原始表,每一次对视图的查询,本质上是执行了之前创建视图时指定的SQL语句

对于原始表的修改,也能在视图中查看到,前提是修改的数据要包含在创建视图时指定的SQL语句中

创建视图的语法:create [or  replace]  view view_name as sql语句;

修改视图的语法:alter view view_name as sql语句;

删除视图的语句:drop view view_name;

 

 

二、触发器***

什么是触发器:使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

       触发器是一段与某个表有关的mysql的程序

       当达到某种条件时,触发某个东西的执行

使用触发器的条件:时间点:before      after

           具体事件:update 中包含new,old

              delete中只有old

              insert中只有new

达到条件后会自动执行一段mysql程序

 

触发器的作用:比如做一个博客系统,需要在执行更新时,自动记录更新时间以及更新的具体的内容

       换句话说,就是可以帮你带一个表被修改时,做一些额外的操作

1 create trigger name after delete on tablename for each row
2 begin
3     #具体要执行的操作
4 end

在触发器中有两个隐藏的对象:new(新的数据) 和 old(旧的数据)

 1 创建一个博客表
 2 id title content commit_time
 3 
 4 更新记录表
 5 id content update_time b_id
 6 
 7 
 8 创建触发器
 9 #在blog表发生了update事件时,要自动将更新后的数据插入到记录表
10 #重定义结束符号为  //  因为触发器中包含分号,而分号是默认的结束符,所以要重新定义结束符为 //
11 
12 delimiter //
13 create trigger t1 after update on blog for each row
14 begin
15      insert into update_log value(null,new.content,now(),new.id);
16 end //
17 delimiter;
18 
19 select *from users //
触发器的案例一
 1 cmd表存储的是什么时间执行了什么指令,得到的结果是什么
 2 errlog表存储的是所有执行失败的指令信息
 3 当数据插入cmd表时,会做出判断,如果success为no,就将这个信息插入errlog表中
 4 
 5 delimiter ||
 6 create trigger t3 after insert on cmd for each row
 7 begin
 8     select *from cmd;
 9     if new.success = "no" then
10         insert into errlog values(null,new.cmd,now());
11     end if ;
12 end ||
13 delimiter ;
14 #触发器不会影响原表的操作,只是增加了一些额外的操作
触发器案例二

注意:   有a表 和 b表

    b表有外键,b表的外键关联了a的主键,并且设置了级联,删除和更新

    当删除a表中的记录时,并不会触发b表的触发器 

 

 

 

三、事务******

事务保证了一件事情的完整性,比如银行转账,要么转成功,要么转失败。不可能存在一方扣款了,因为断电等操作,而导致另一方钱没有到账

事务是逻辑上一组SQL语句的集合

特点是:一个事务的所有SQL语句,要么全部成功,要么全部失败

事务的强大之处:当发生一些不可控制的因素时,可以保证数据是完整的额

 1 start transaction;#开启事务
 2 
 3 #从alan账户转走100元
 4 update account set money = money - 100 where name = "alan";
 5 
 6 #转入kobe账户100元
 7 update account set money = money + 100 where name = "kobe";
 8 
 9 #如果发生错误(断电,系统崩溃等因素),可以回滚
10 rollback;
11 
12 #如果没有发生错误,没有任何问题那就直接提交,只有执行了提交操作,两个账户的钱才会被修改
13 commit #提交事务
14 
15 #一旦执行了commit 就不可能再回滚
事务之转账案例

rollback是全部撤销(回滚)
savepoint 可以创建保存点,可以选择性的回滚一部分

 

事务的四个特征:

1.原子性:一个事务是一个整体,不可拆分的

2.一致性:所有的数据都是完整的(外键约束,非空约束)

3.隔离性:两个事务之间相互独立(与效率相关)

4.永久性:一个事务一旦提交,那就是永久性的,不能再回滚

 

四种隔离级别:读未提交、读已提交、可重复读(作为默认的)、串行化(最严格的锁,但是性能低)

 

 

四、存储过程*****

一个存储过程中包含任意SQL语句,以及流程控制,事务等等

就是将一系列较为复杂的逻辑封装到了mysql中

好处:将业务逻辑放到mysql中来处理,可以降低网络访问次数,以此来提高程序效率

弊端:学习成本高,运营成本高,沟通成本高(三高)

 

三种开发的模型:

1.营运程序开发者只关注业务逻辑,数据相关的逻辑交给存储过程

优点:优化网络

缺点:耦合度降低了;学习成本高,运营成本高,沟通成本高;存储过程移植性很差,每种数据语法都不一样

2.营运程序开发者不仅关注业务逻辑,还要编写原生的SQL语句

优点:一个人负责全部,没有沟通成本

缺点:SQL语句编写繁琐,导致开发效率低

3.应用程序开发者仅关注业务逻辑,把SQL语句相关的交给ORM框架(对象关系映射,封装了增删改查,自动生成sql语句)

优点:开发效率高

缺点:执行效率较低

 

创建存储过程与函数的区别:函数仅仅是一个单纯的工具,与数据无关,所以函数中不能出现SQL语句,存储过程既可以包含mysql的逻辑代码,也能包含SQL语句