mysql 檢視,事務,與儲存過程的簡要說明
阿新 • • 發佈:2018-12-11
1.1 檢視
根據SQL語句獲取動態的資料集,併為其命名 # CREATE VIEW 檢視名稱 AS SQL語句 # create view t1 as select * from teacher; # 建立的檢視有自己的表結構,並且如果對檢視的資料進行更改的話,相當於更改本生的表的資料 #更改檢視 # 語法:ALTER VIEW 檢視名稱 AS SQL語句 相當於刪掉重建一樣 # 刪除檢視 # 語法:DROP VIEW 檢視名稱 # DROP VIEW teacher_view # 觸發器 # 使用觸發器可以定製使用者對某一張表的資料進行【增、刪、改】操作時的前後,觸發對另一張表進行操作檢視 view# create trigger 自定義的觸發的名稱 after/before insert on 操作的表名 for each row # begin # ...... # end # 觸發器刪除 # drop trigger +觸發器的名稱 # 示例 # delimiter // # CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW # BEGIN # IF NEW.success = 'no' THEN # INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time);# END IF # END// # NEW表示即將插入的資料行,OLD表示即將刪除的資料行
1.2 事務
# 事務的四大特性: # # 1. # # 原子性(Atomicity) # # 事務是一個不可分割的單位,事務中的所有SQL等操作要麼都發生,要麼都不發生。 # # 2. # # 一致性(Consistency) # # 事務發生前和發生後,資料的完整性必須保持一致。 # # 3. # # 隔離性(Isolation) # # 當併發訪問資料庫時,一個正在執行的事務在執行完畢前,對於其他的會話是不可見的,多個併發事務之間的資料是相互隔離的。也就是其他人的操作在這個事務的執行過程中是看不到這個事務的執行結果的,也就是他們拿到的是這個事務執行之前的內容,等這個事務執行完才能拿到新的資料。事務 start transaction# # 4. # # 永續性(Durability) # # 一個事務一旦被提交,它對資料庫中的資料改變就是永久性的。如果出了錯誤,事務也不允撤銷,只能通過 # # '補償性事務'。 # 通過一個儲存過程對事務進行說明 # delimiter // # create PROCEDURE p5() # BEGIN # DECLARE exit handler for sqlexception # BEGIN # rollback; # END; # # START TRANSACTION;#開啟事務 # update user set balance=900 where name='wsb'; #買支付100元 # update user set balance=1010 where name='chao'; #中介拿走10元 # #update user2 set balance=1090 where name='ysb'; #賣家拿到90元 # update user set balance=1090 where name='ysb'; #賣家拿到90元 # COMMIT; #在事務中,對資料進行操作後的資料沒有直接寫入到硬碟中,通過commit的資料 # 才會將資料儲存到硬碟中, # # END // # delimiter ;
1.3儲存過程 in /out/inout
# 儲存過程(在那個庫中建立的 就只能在哪個庫中使用) # 儲存過程包含了一系列可執行的sql語句,儲存過程存放於MySQL中,通過呼叫它的名字可以執行其內部的一堆sql # 儲存過程的優點是:用於替代程式寫的SQL語句,實現程式與sql解耦 # 基於網路傳輸,傳別名的資料量小,而直接傳sql資料量大 # 無引數的儲存過程 # delimiter // # create procedure p1() # begin # select * from s1; # end // # delimiter ; # # 儲存過程的呼叫方法 # call p1() # 在pymysql 中的儲存過程的呼叫方法 # cursor.callproc('p1') # print(cursor.fetchall()) # 有引數的儲存過程 # 對於儲存過程,可以接收引數,其引數有三類: #in 僅用於傳入引數用 #out 僅用於返回值用,就是從儲存過程裡面傳遞值出來,而沒有傳遞值進去 #inout 既可以傳入又可以當作返回值 # delimiter // # create procedure p2(in g1 int ,out g2 int) # begin # select * from s1 where id >g1; # set g2 = 6; # end // # delimiter ; # 呼叫方式 # 在mysql上的呼叫方式 # set @g2 = 0;# 有out型別的資料才會進行宣告 # call p2(2,@g2) # select @res; #檢視返回的值 # 在pymysql上的呼叫方式 # cursor.callproc('p2',(3,0))#0相當於set @res=0,在pymysql中,會自動為兩個引數生成一個臨時的變數 # 第一個引數變數名:@_p2_0=3,第二個:@_p2_1=0 # print(cursor.fetchall()) # cursor.execute('select @_p2_0,@_p2_1;') #@_p3_0代表第一個引數,@_p3_1代表第二個引數,即返回值 # cursor.close() # conn.close() # inout:既可傳入又可以返回值: # delimiter // # create procedure p3(inout g3 int) # begin # select * from s1 ; # set g3 = 10; # end // # delimiter ; # 與上面的一樣 # set @hh = 5; # call p3(@hh) # select @hh # 儲存過程綜合例項 #create procedure p4(out code int) #begin # #declare exit handler for sqlexception #異常捕獲 #begin #set code = 1 ; #rollback; #end; # # #declare exit handler for sqlwarning #告警捕獲 #begin #set code = 2; #rollback; #end; # #start transaction;#事務 #delete from tb1; #insert into s1 value('11','22','33'); #commit; #set code = 0; #end // # delimiter ; # 呼叫 (注意下面是兩條命令) # set @gg = 9; # call p4(@gg);儲存過程