10.13 視圖
1、什么是視圖 視圖就是通過(guò)查詢得到一張?zhí)摂M表,然后保存下來(lái),下次用的直接使用即可
2、為什么要用視圖 如果要頻繁使用一張?zhí)摂M表,可以不用重復(fù)查詢
3、如何使用視圖
視圖記錄的增、刪、改和表方法相同,但改變視圖記錄,原始表也跟著改,所以不要修改視圖記錄,只用于查看
create view teacher2course as #創(chuàng)建視圖 select * from teacher inner join course on teacher.tid = course.teacher_id; ? alter view teacher2course as #修改視圖名 select * from teacher inner join course on teacher.tid = course.teacher_id; ? drop view teacher2course; #刪除視圖
強(qiáng)調(diào): 1、在硬盤中,視圖只有表結(jié)構(gòu)文件,沒有表數(shù)據(jù)文件 2、視圖通常用于查詢,盡量不要修改視圖中的數(shù)據(jù)
10.14 觸發(fā)器
觸發(fā)器:在滿足對(duì)某張表數(shù)據(jù)的 增、刪、改 的情況下,自動(dòng)觸發(fā)的功能稱之為觸發(fā)器 觸發(fā)器專門針對(duì)我們對(duì)某一張表數(shù)據(jù) 增insert 、 刪delete 、 改update 的行為,這類行為一旦執(zhí)行就會(huì)觸發(fā)觸發(fā)器的執(zhí)行,即自動(dòng)運(yùn)行另外一段sql代碼
創(chuàng)建觸發(fā)器語(yǔ)法:
# 針對(duì)插入( insert ) create trigger tri_after_insert_t1 after insert on 表名 for each row begin sql代碼... end ? create trigger tri_before_insert_t2 before insert on 表名 for each row begin sql代碼... end ? # 針對(duì)刪除( delete ) create trigger tri_after_delete_t1 after delete on 表名 for each row begin sql代碼... end ? create trigger tri_before_delete_t2 before delete on 表名 for each row begin sql代碼... end ? # 針對(duì)修改( update ) create trigger tri_after_update_t1 after update on 表名 for each row begin sql代碼... end ? create trigger tri_before_update_t2 before update on 表名 for each row begin sql代碼... end
舉例:

CREATE TABLE cmd ( id INT PRIMARY KEY auto_increment, USER CHAR ( 32 ), priv CHAR ( 10 ), cmd CHAR ( 64 ), sub_time datetime , #提交時(shí)間 success enum ( ' yes ' , ' no ' ) ); CREATE TABLE errlog ( id INT PRIMARY KEY auto_increment, err_cmd CHAR ( 64 ), err_time datetime ); delimiter $$ create trigger tri_after_insert_cmd after insert on cmd for each row begin if NEW.success = ' no ' then #等值判斷只有一個(gè)等號(hào) insert into errlog(err_cmd,err_time) values (NEW.cmd,NEW.sub_time); end if ; end $$ delimiter ; ? insert into cmd ( USER ,priv,cmd,sub_time,success) values ( ' egon ' , ' 0755 ' , ' ls -l /etc ' ,NOW(), ' yes ' ), ( ' egon ' , ' 0755 ' , ' cat /etc/passwd ' ,NOW(), ' no ' ), ( ' egon ' , ' 0755 ' , ' useradd xxx ' ,NOW(), ' no ' ), ( ' egon ' , ' 0755 ' , ' ps aux ' ,NOW(), ' yes ' ); ? mysql > select * from errlog; #查詢錯(cuò)誤日志,發(fā)現(xiàn)有兩條 + -- --+-----------------+---------------------+ | id | err_cmd | err_time | + -- --+-----------------+---------------------+ | 1 | cat / etc / passwd | 2017 - 09 - 14 22 : 18 : 48 | | 2 | useradd xxx | 2017 - 09 - 14 22 : 18 : 48 | + -- --+-----------------+---------------------+
刪除觸發(fā)器:
drop trigger tri_after_insert_cmd;
10.15 事務(wù)
什么是事務(wù): 開啟一個(gè)事務(wù)可以包含一些sql語(yǔ)句,這些sql語(yǔ)句要么同時(shí)成功,要么都不成功,稱之為事務(wù)的原子性 作用:事務(wù)用于將某些操作的多個(gè)SQL作為原子性操作,一旦有某一個(gè)出現(xiàn)錯(cuò)誤,即可回滾到原來(lái)的狀態(tài),從而保證數(shù)據(jù)庫(kù)數(shù)據(jù)完整性。
create table user ( id int primary key auto_increment, name char ( 32 ), balance int ); insert into user (name,balance) values ( ' wsb ' , 1000 ), ( ' egon ' , 1000 ), ( ' ysb ' , 1000 ); ? start transaction ; #開啟事務(wù) update user set balance = 900 where name = ' wsb ' ; #買支付100元 update user set balance = 1010 where name = ' egon ' ; #中介拿走10元 update user set balance = 1090 where name = ' ysb ' ; #賣家拿到90元,出現(xiàn)異常沒有拿到 rollback ; #出現(xiàn)異常,回滾到初始狀態(tài) commit ; #無(wú)異常,提交結(jié)果,提交后回滾無(wú)效
10.16 存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程包含了一系列可執(zhí)行的sql語(yǔ)句,存儲(chǔ)過(guò)程存放于MySQL中,通過(guò)調(diào)用它的名字可以執(zhí)行其內(nèi)部的一堆sql
存儲(chǔ)過(guò)程的優(yōu)點(diǎn):1、用于替代程序?qū)懙腟QL語(yǔ)句,實(shí)現(xiàn)程序與sql解耦 2、基于網(wǎng)絡(luò)傳輸,傳別名的數(shù)據(jù)量小,而直接傳sql數(shù)據(jù)量大
存儲(chǔ)過(guò)程的缺點(diǎn):程序員擴(kuò)展功能不方便
10.161 創(chuàng)建與執(zhí)行存儲(chǔ)過(guò)程
創(chuàng)建簡(jiǎn)單存儲(chǔ)過(guò)程(無(wú)參):
delimiter $$ create procedure p1() BEGIN select * from blog; insert into blog(name,sub_time) values ("xxx",now()); END $$ delimiter ; ? #在mysql中調(diào)用 call p1() ? #在python中基于pymysql調(diào)用 cursor .callproc( ' p1 ' ) print ( cursor .fetchall())
創(chuàng)建存儲(chǔ)過(guò)程(有參):
delimiter $$ create procedure p2( in m int , #只可傳入 in n int , out res int ) #只可返回 # inout 既可以傳入又可以當(dāng)作返回值 begin select tname from teacher where tid > m and tid < n; set res = 1 ; #執(zhí)行成功res返回0 end $$ delimiter ; ? #在mysql中調(diào)用 set @res = 0 ; call p2( 3 , 2 , @res ) select @res ; #0代表假(執(zhí)行失?。?,1代表真(執(zhí)行成功) ? #在python中基于pymysql調(diào)用 cursor .callproc( ' p2 ' ,( 2 , 3 , 0 )) #0相當(dāng)于set @res = 0 print ( cursor .fetchall()) #查詢select的查詢結(jié)果 ? cursor . execute ( ' select @_p2_2; ' ) # @_p2_2代表第三個(gè)參數(shù) ,即返回值 print ( cursor .fetchall())
將事務(wù)封裝入存儲(chǔ)過(guò)程:

delimiter // create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1 ; rollback ; END ; ? DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2 ; rollback ; END ; ? START TRANSACTION ; DELETE from tb1; #執(zhí)行失敗 insert into blog(name,sub_time) values ( ' yyy ' ,now()); COMMIT ; ? -- SUCCESS set p_return_code = 0 ; #0代表執(zhí)行成功 ? END // delimiter ; ? #在mysql中調(diào)用存儲(chǔ)過(guò)程 set @res = 123 ; call p5( @res ); select @res ; ? #在python中基于pymysql調(diào)用存儲(chǔ)過(guò)程 cursor .callproc( ' p5 ' ,( 123 ,)) print ( cursor .fetchall()) #查詢select的查詢結(jié)果 ? cursor . execute ( ' select @_p5_0; ' ) print ( cursor .fetchall())
10.162 刪除存儲(chǔ)過(guò)程
drop procedure proc_name;
回到頂部
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
