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;
回到顶部

