(三十九)视图,触发器,事务

1、视图mysql

视图是个虚拟表,只存在于内存中,可是它的表结构是存在于硬盘上的。为何要用视图:使用视图咱们能够把查询过程当中的临时表摘出来,保存下来,用视图去实现,这样之后再想操做该临时表的数据时就无需重写复杂的sql了,直接去视图中查找便可,但视图有明显地效率问题,而且视图是存放在数据库中的,若是咱们程序中使用的sql过度依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,所以并不推荐使用。程序员

  1. 建立视图

        create view t1_view as select *from t1;sql

        Create  view 视图名 as  sql语句;数据库

  1. 修改表内容

     update t1  set age=88 where id = 4;网络

  1. 插入数据

     insert into t1_view(name,age) values('mm',67),('uiui',90);ui

  1. 删除视图

       drop  view  t1_view;spa

       drop  view  视图名;事务

  1. 修改视图

   alter view tt_view as select *from t2;内存

   alter  view  视图名  as  sql语句;开发

   

#!!!注意注意注意:

#1. 使用视图之后就无需每次都重写子查询的sql,开发的时候是方便了不少,可是这么效率并不高,还不如咱们写子查询的效率高

#2. 并且有一个致命的问题:视图是存放到数据库里的,若是咱们程序中的sql过度依赖于数据库中存放的视图,那么意味着,一旦sql须要修改且涉及到视图的部分,则必须去数据库中进行修改,而后再到本身的应用程序里面将那个sql语句改一改,须要不少的修改工做,并而对视图的更改一般在通常中型及以上公司中数据库有专门的DBA负责,你要想完成修改,必须付出大量的沟通成本DBA可能才会帮你完成修改,极其地不方便
这么多的弊端,为何mysql还要提供这个东西呢,有一点是由于mysql想把全部数据处理的工做所有接手过来,但其实还有其余的缘由,等咱们讲完存储过程在和你们说吧。
#3 而且注意:视图通常都是用于查询,尽可能不要修改(插入、删除等)视图中的数据,虽然有时候能够修改为功,可是尽可能不要这样作,由于这个视图多是多个表联合起来生成的一个结果,若是你修改它,可能会形成不少表里面的数据都跟着被修改了

 

小总结:单表查询时,能够对表实现插入和修改,可是联表时,能够插入,但不能修改。插入数据时,values()括号内写的哪一个表的字段,那么就就会给哪一个表插入数据。

 

2、触发器

  实现对一张表操做前或者后,进行一些其余的操做。触发器是被动调用的,而且会一直伴随这张表。

1--t1

Id  name  age

2--t2

Id  content  tid(这个是t1表的id)

 

Delimiter  //#从新声明一个结束符

Create trigger tri_1 after(befor)  insert(update,delete) on t2 for each row #建立一个触发器,没有结束符

If new.tid > 5   then  #使用if判断

  Insert into t1(name,age) values(‘uuuu’,new.tid);#t2操做完后,对t1进行的操做

End if;# if操做结束

End //  #触发器内容执行完毕

Delimiter ;#把结束符再声明回分号“;”

 

删除触发器:

drop trigger 触发器名字;

 

3、事务

  把多个sql语句绑定在一块儿执行,而且其中某个没有执行成功,只要没有commit,就还能够回滚rollback

  start transaction;

insert into t1(name,age) values('11211aaaaa',24);

  insert into t3(name,age) values('bbbbbbb',67);#实际没有t3表,因此会报错

insert into t2(content,tid) values('ccccccc', 13);

 

上面第二条插入数据的sql语句报错,因此rollback回滚一下,回到原来的数据。

  

4、存储过程

  sql语句作成一个过程,这样方便程序员调用。存储过程有其本身的优缺点:

  优势:

   #1. 用于替代程序写的SQL语句,实现程序与sql解耦

#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大

  缺点:

   #1. 程序员扩展功能不方便

 

  1. 建立无参存储过程

  

delimiter //   #声明一个结束符

create procedure p1()   #建立一个存储过程

Begin  #开始

select *from t1;#过程当中执行的sql语句

insert into t2(content,tid) values('9090ooiioijkkj',6);#过程当中执行的sql语句

end // #执行完毕

delimiter ;  #把结束符从新声明回“;

 

  1. 建立有参数的存储过程

 

delimiter //  #声明一个新的结束符

create procedure p5(

in arg1 int,

out arg2 char,

inout arg3 int

)  #建立一个存储过程

Begin#过程开始执行

select *from t1 where name='tom';  #过程当中的sql语句

select *from t1 where id > arg1;   #过程当中的sql语句

insert into t1(name,age) values('Moon',27); #过程当中的sql语句

set arg2 = 'finish';#out类型的变量从新赋值

set arg3 = 20;  #inout类型的变量从新设置值

end //  #过程执行完毕

delimiter ;  #把结束符从新声明回来

 

 

set @res1='tom';  #建立一个变量

set @res2=10;   #建立一个变量

call p2(2,@res1,@res2);  #调用存储过程

 

select @res1;  #查询out类型的值被修改成什么了

select @res2;  #查询inout类型的值被修改成什么了

 

  1. 删除存储过程

  Drop procedure 过程名;

相关文章
相关标签/搜索