Mysql(三) 视图和触发器
1. 视图
1.1 视图概述
视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询 中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果 集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
视图相对于普通的表的优势主要包括以下几项。
简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已 经是过滤好的复合条件的结果集。
安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某 个列,但是通过视图就可以简单的实现。
数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影 响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
1.2 创建或者修改视图 创建视图的语法为:
-- 创建视图
create view 视图名
as
sql语句;
-- 创建视图
create view view_city_country
as
select c.*,cou.country_name from city c,country cou where c.country_id=cou.country_id;
1.3查看视图
-- 查看视图
show tables;
-- 使用视图
select * from 视图名;
select city_name,country_name from view_city_country;
-- 通过视图修改数据
update view_city_country set city_name='西安市' where city_id=1;
-- 查看视图的定义
show create view 视图名;
1.4删除视图
-- 删除视图
drop view view_city_country;
2. 触发器
2.1 介绍
触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的 SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操 作 。
使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器 还只支持行级触发,不支持语句级触发.
触发器类型 | NEW 和 OLD的使用 |
INSERT 型触发器 | NEW 表示将要或者已经新增的数据 |
UPDATE 型触发器 O | OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据 |
DELETE 型触发器 | OLD 表示将要或者已经删除的数据 |
2.2 创建触发器
-- 创建emp_logs日志表
create table emp_logs(
id int(11) not null auto_increment,
operation varchar(20) not null comment '操作类型, insert/update/delete',
operate_time datetime not null comment '操作时间',
operate_id int(11) not null comment '操作表的ID',
operate_params varchar(500) comment '操作参数',
primary key(`id`)
)engine=innodb default charset=utf8;
-- 创建触发器,影响emp表的数据时记录日志
-- 给emp添加数据的同时给emp_logs表添加一条数据
-- 添加时触发
create trigger triger_emp_insert
after insert
on emp
for each row
begin
insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'insert',NOW(),new.id,
concat('插入的数据(id:',new.id,'name:',new.name,'age:',new.age,'salary:',new.salary,')'));
end
创建 update 型触发器,完成更新数据时的日志记录
-- 触发器的使用
-- 修改时触发
create trigger trigger_emp_update
after update
on emp
for each row
begin
insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
values(null,'update',NOW(),old.id,
concat('修改前(id:',old.id,',name:',old.name,',age:',old.age,',salary:',old.salary,')',
'修改后(id:',new.id,',name:',new.name,',age:',new.age,',salary:',new.salary,')'));
end
创建delete 行的触发器 , 完成删除数据时的日志记录 :
create trigger emp_logs_delete_trigger
after delete
on emp
for each row
begin
insert into emp_logs (id,operation,operate_time,operate_id,operate_params)
values(null,'delete',now(),old.id,concat('删除前(id:',old.id,',
name:',old.name,', age:',old.age,', salary:',old.salary,')'));
end
2.3 删除触发器
drop trigger 触发器名称;
2.4 查看触发器
show triggers ;