10.13 視圖
1、什么是視圖 視圖就是通過查詢得到一張虛擬表,然后保存下來,下次用的直接使用即可
2、為什么要用視圖 如果要頻繁使用一張虛擬表,可以不用重復查詢
3、如何使用視圖
視圖記錄的增、刪、改和表方法相同,但改變視圖記錄,原始表也跟著改,所以不要修改視圖記錄,只用于查看
create
view
teacher2course
as
#創建視圖
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; #刪除視圖
強調: 1、在硬盤中,視圖只有表結構文件,沒有表數據文件 2、視圖通常用于查詢,盡量不要修改視圖中的數據
10.14 觸發器
觸發器:在滿足對某張表數據的 增、刪、改 的情況下,自動觸發的功能稱之為觸發器 觸發器專門針對我們對某一張表數據 增insert 、 刪delete 、 改update 的行為,這類行為一旦執行就會觸發觸發器的執行,即自動運行另外一段sql代碼
創建觸發器語法:
# 針對插入(
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
?
# 針對刪除(
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
?
# 針對修改(
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
, #提交時間
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
#等值判斷只有一個等號
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; #查詢錯誤日志,發現有兩條
+
--
--+-----------------+---------------------+
|
id
|
err_cmd
|
err_time
|
+
--
--+-----------------+---------------------+
|
1
|
cat
/
etc
/
passwd
|
2017
-
09
-
14
22
:
18
:
48
|
|
2
|
useradd xxx
|
2017
-
09
-
14
22
:
18
:
48
|
+
--
--+-----------------+---------------------+
刪除觸發器:
drop
trigger
tri_after_insert_cmd;
10.15 事務
什么是事務: 開啟一個事務可以包含一些sql語句,這些sql語句要么同時成功,要么都不成功,稱之為事務的原子性 作用:事務用于將某些操作的多個SQL作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證數據庫數據完整性。
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
; #開啟事務
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元,出現異常沒有拿到
rollback
; #出現異常,回滾到初始狀態
commit
; #無異常,提交結果,提交后回滾無效
10.16 存儲過程
存儲過程包含了一系列可執行的sql語句,存儲過程存放于MySQL中,通過調用它的名字可以執行其內部的一堆sql
存儲過程的優點:1、用于替代程序寫的SQL語句,實現程序與sql解耦 2、基于網絡傳輸,傳別名的數據量小,而直接傳sql數據量大
存儲過程的缺點:程序員擴展功能不方便
10.161 創建與執行存儲過程
創建簡單存儲過程(無參):
delimiter $$
create
procedure
p1()
BEGIN
select
*
from
blog;
insert
into
blog(name,sub_time)
values
("xxx",now());
END
$$
delimiter ;
?
#在mysql中調用
call p1()
?
#在python中基于pymysql調用
cursor
.callproc(
'
p1
'
)
print
(
cursor
.fetchall())
創建存儲過程(有參):
delimiter $$
create
procedure
p2(
in
m
int
, #只可傳入
in
n
int
,
out res
int
) #只可返回 # inout 既可以傳入又可以當作返回值
begin
select
tname
from
teacher
where
tid
>
m
and
tid
<
n;
set
res
=
1
; #執行成功res返回0
end
$$
delimiter ;
?
#在mysql中調用
set
@res
=
0
;
call p2(
3
,
2
,
@res
)
select
@res
; #0代表假(執行失敗),1代表真(執行成功)
?
#在python中基于pymysql調用
cursor
.callproc(
'
p2
'
,(
2
,
3
,
0
)) #0相當于set
@res
=
0
print
(
cursor
.fetchall()) #查詢select的查詢結果
?
cursor
.
execute
(
'
select @_p2_2;
'
) #
@_p2_2代表第三個參數
,即返回值
print
(
cursor
.fetchall())
將事務封裝入存儲過程:
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; #執行失敗
insert
into
blog(name,sub_time)
values
(
'
yyy
'
,now());
COMMIT
;
?
--
SUCCESS
set
p_return_code
=
0
; #0代表執行成功
?
END
//
delimiter ;
?
#在mysql中調用存儲過程
set
@res
=
123
;
call p5(
@res
);
select
@res
;
?
#在python中基于pymysql調用存儲過程
cursor
.callproc(
'
p5
'
,(
123
,))
print
(
cursor
.fetchall()) #查詢select的查詢結果
?
cursor
.
execute
(
'
select @_p5_0;
'
)
print
(
cursor
.fetchall())
10.162 刪除存儲過程
drop
procedure
proc_name;
回到頂部
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

