(三十九)視圖,觸發器,事務

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 過程名;

相關文章
相關標籤/搜索